@nextclaw/ui 0.11.17 → 0.11.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/dist/assets/ChannelsList-DAx7wv0_.js +8 -0
  3. package/dist/assets/{ChatPage-C47h6sfA.js → ChatPage-l2PYwCeB.js} +9 -7
  4. package/dist/assets/DocBrowser-CIHLqoIm.js +1 -0
  5. package/dist/assets/{DocBrowser-C_C7daBv.js → DocBrowser-DKkE3Y4I.js} +1 -1
  6. package/dist/assets/{DocBrowserContext-CJ-YKtWh.js → DocBrowserContext-BcZRBsCg.js} +1 -1
  7. package/dist/assets/{LogoBadge-DRDmIa7o.js → LogoBadge-BIPDLEwK.js} +1 -1
  8. package/dist/assets/{MarketplacePage-DaSRsFUA.js → MarketplacePage-Dlp5BgCh.js} +1 -1
  9. package/dist/assets/MarketplacePage-TVeyVOuO.js +1 -0
  10. package/dist/assets/{McpMarketplacePage-B7HZn8zG.js → McpMarketplacePage-CwKtAil8.js} +1 -1
  11. package/dist/assets/{ModelConfig-MSi8VF9p.js → ModelConfig-Dg6F3Ldb.js} +1 -1
  12. package/dist/assets/{ProvidersList-_NBpSQWn.js → ProvidersList-f7bQdRxA.js} +1 -1
  13. package/dist/assets/{RemoteAccessPage-DSmdSsCJ.js → RemoteAccessPage-w_dY7P4T.js} +1 -1
  14. package/dist/assets/{RuntimeConfig-msA8NZOj.js → RuntimeConfig-M4OKjmgU.js} +1 -1
  15. package/dist/assets/{SearchConfig-BBtxHIN_.js → SearchConfig-v46R5a2U.js} +1 -1
  16. package/dist/assets/{SecretsConfig-BMAqj52o.js → SecretsConfig-CXvUpbB_.js} +1 -1
  17. package/dist/assets/{SessionsConfig-CEJqgz8F.js → SessionsConfig-7vUHMtOh.js} +1 -1
  18. package/dist/assets/{book-open-1agbn9dT.js → book-open-DzSduAaw.js} +1 -1
  19. package/dist/assets/{chat-session-display-DBBUJOYN.js → chat-session-display-CGfXhJoT.js} +1 -1
  20. package/dist/assets/{chunk-JZWAC4HX-BUooP92l.js → chunk-JZWAC4HX-C1vpvW4r.js} +1 -1
  21. package/dist/assets/{config-jOAXZWun.js → config-Df97LeLR.js} +1 -1
  22. package/dist/assets/{createLucideIcon-B8FV3fzy.js → createLucideIcon-CcR5wVoU.js} +1 -1
  23. package/dist/assets/{dist-D3OJg9V0.js → dist-BMlnBah3.js} +1 -1
  24. package/dist/assets/{dist-Cy668qFZ.js → dist-Dii9v3X9.js} +1 -1
  25. package/dist/assets/{external-link-DI4ZmR3r.js → external-link-CnSDrvJE.js} +1 -1
  26. package/dist/assets/{hash-DoXBhX9w.js → hash-CAnX6PNt.js} +1 -1
  27. package/dist/assets/i18n-CXBpwAwA.js +1 -0
  28. package/dist/assets/{index-bAeWRAyo.js → index-B0DzQqwv.js} +3 -3
  29. package/dist/assets/index-BahpXJg8.css +1 -0
  30. package/dist/assets/{label-Cz0q8fx4.js → label-CtIFj7_6.js} +1 -1
  31. package/dist/assets/loader-circle-qgU4zQDw.js +1 -0
  32. package/dist/assets/{logos-DjrINZ7P.js → logos-3KFNiOej.js} +1 -1
  33. package/dist/assets/{page-layout-Hr-Dvq4o.js → page-layout-BMwpn87D.js} +1 -1
  34. package/dist/assets/plus-C9cYVbL-.js +1 -0
  35. package/dist/assets/{popover-_nEUAtWY.js → popover-BIzq25oH.js} +1 -1
  36. package/dist/assets/{react-Bsr_GLhi.js → react-ji6GGP_j.js} +1 -1
  37. package/dist/assets/{save-Caodcm4q.js → save-CMgYkJ-y.js} +1 -1
  38. package/dist/assets/search-sl1OeJFl.js +1 -0
  39. package/dist/assets/{security-config-Zf1RBeS1.js → security-config-Xi5DYW7j.js} +1 -1
  40. package/dist/assets/{select-D60QRHg9.js → select-Cz82gl01.js} +1 -1
  41. package/dist/assets/skeleton-rgIt7a5q.js +1 -0
  42. package/dist/assets/{status-dot-D43lBF1a.js → status-dot-C7q1HvLH.js} +1 -1
  43. package/dist/assets/{switch-CcBS0F3U.js → switch-DYswvkYj.js} +1 -1
  44. package/dist/assets/{tabs-custom-UTbefkqB.js → tabs-custom-DKYQxrx1.js} +1 -1
  45. package/dist/assets/{trash-2-DvPrU1xO.js → trash-2-DfXI7-ap.js} +1 -1
  46. package/dist/assets/{useConfirmDialog-B89bxcd6.js → useConfirmDialog-CXDAxtRL.js} +1 -1
  47. package/dist/assets/{useMutation-BpXHE2OV.js → useMutation-s2sn2yzh.js} +1 -1
  48. package/dist/assets/x-MIimOGs6.js +1 -0
  49. package/dist/index.html +18 -18
  50. package/package.json +6 -6
  51. package/src/components/chat/ChatConversationPanel.tsx +1 -0
  52. package/src/components/chat/adapters/chat-input-bar.adapter.test.ts +103 -1
  53. package/src/components/chat/adapters/chat-input-bar.adapter.ts +80 -2
  54. package/src/components/chat/adapters/chat-message-inline-content.adapter.ts +95 -0
  55. package/src/components/chat/adapters/chat-message-part.adapter.ts +384 -0
  56. package/src/components/chat/adapters/chat-message.adapter.test.ts +49 -2
  57. package/src/components/chat/adapters/chat-message.adapter.ts +18 -366
  58. package/src/components/chat/adapters/chat-message.subagent-tool-card.ts +46 -17
  59. package/src/components/chat/chat-composer-state.test.ts +2 -6
  60. package/src/components/chat/chat-composer-state.ts +27 -6
  61. package/src/components/chat/chat-inline-token.utils.test.ts +87 -0
  62. package/src/components/chat/chat-inline-token.utils.ts +146 -0
  63. package/src/components/chat/chat-input/chat-input-bar.controller.test.tsx +24 -0
  64. package/src/components/chat/chat-input/chat-input-bar.controller.ts +81 -44
  65. package/src/components/chat/chat-recent-skills.manager.ts +8 -0
  66. package/src/components/chat/containers/chat-input-bar.container.tsx +31 -4
  67. package/src/components/chat/containers/chat-message-list.container.test.tsx +45 -0
  68. package/src/components/chat/containers/chat-message-list.container.tsx +11 -5
  69. package/src/components/chat/ncp/NcpChatPage.tsx +10 -1
  70. package/src/components/chat/ncp/ncp-chat-input.manager.ts +18 -4
  71. package/src/components/chat/presenter/chat-presenter-context.tsx +1 -0
  72. package/src/components/config/ChannelForm.tsx +71 -39
  73. package/src/components/config/channel-form-fields.test.ts +28 -0
  74. package/src/components/config/channel-form-fields.ts +95 -30
  75. package/src/components/config/weixin-channel-auth-section.test.tsx +26 -0
  76. package/src/components/config/weixin-channel-auth-section.tsx +6 -2
  77. package/src/lib/i18n.channel-auth.ts +5 -0
  78. package/dist/assets/ChannelsList-askIl_uW.js +0 -8
  79. package/dist/assets/DocBrowser-Cf7uSIoM.js +0 -1
  80. package/dist/assets/MarketplacePage-q12sRrvZ.js +0 -1
  81. package/dist/assets/i18n-Cn8SErDV.js +0 -1
  82. package/dist/assets/index-B2VeWxfm.css +0 -1
  83. package/dist/assets/loader-circle-d_mzMi2S.js +0 -1
  84. package/dist/assets/plus-BnGg0mB-.js +0 -1
  85. package/dist/assets/search-CQCQaN4Z.js +0 -1
  86. package/dist/assets/skeleton-BvV_2nf3.js +0 -1
  87. package/dist/assets/x-C8AWDn7c.js +0 -1
@@ -1,4 +1,4 @@
1
- import { useEffect, useState } from 'react';
1
+ import { useEffect, useMemo, useState } from 'react';
2
2
  import { useConfig, useConfigMeta, useConfigSchema, useUpdateChannel, useExecuteConfigAction } from '@/hooks/useConfig';
3
3
  import { Button } from '@/components/ui/button';
4
4
  import { StatusDot } from '@/components/ui/status-dot';
@@ -13,7 +13,7 @@ import { resolveChannelTutorialUrl } from '@/lib/channel-tutorials';
13
13
  import { getChannelLogo } from '@/lib/logos';
14
14
  import { CONFIG_DETAIL_CARD_CLASS, CONFIG_EMPTY_DETAIL_CARD_CLASS } from './config-layout';
15
15
  import { ChannelFormFieldsSection } from './channel-form-fields-section';
16
- import { buildChannelFields } from './channel-form-fields';
16
+ import { buildChannelFormDefinitions, type ChannelField, type ChannelFormBlock, type ChannelFormFieldSection } from './channel-form-fields';
17
17
  import { WeixinChannelAuthSection } from './weixin-channel-auth-section';
18
18
 
19
19
  type ChannelFormProps = {
@@ -50,6 +50,16 @@ function buildScopeDraft(scope: string, value: Record<string, unknown>): Record<
50
50
  return output;
51
51
  }
52
52
 
53
+ function resolveFieldsForSection(fields: ChannelField[], section: ChannelFormFieldSection): ChannelField[] {
54
+ if (section === 'all') {
55
+ return fields;
56
+ }
57
+ if (section === 'primary') {
58
+ return fields.filter((field) => field.section === 'primary');
59
+ }
60
+ return fields.filter((field) => field.section !== 'primary');
61
+ }
62
+
53
63
  export function ChannelForm({ channelName }: ChannelFormProps) {
54
64
  const { data: config } = useConfig();
55
65
  const { data: meta } = useConfigMeta();
@@ -62,7 +72,10 @@ export function ChannelForm({ channelName }: ChannelFormProps) {
62
72
  const [runningActionId, setRunningActionId] = useState<string | null>(null);
63
73
 
64
74
  const channelConfig = channelName ? config?.channels[channelName] : null;
65
- const fields = channelName ? buildChannelFields()[channelName] ?? [] : [];
75
+ const channelDefinitions = useMemo(() => buildChannelFormDefinitions(), []);
76
+ const channelDefinition = channelName ? channelDefinitions[channelName] : undefined;
77
+ const fields = channelDefinition?.fields ?? [];
78
+ const layoutBlocks = channelDefinition?.layout ?? [{ type: 'fields', section: 'all' } satisfies ChannelFormBlock];
66
79
  const uiHints = schema?.uiHints;
67
80
  const scope = channelName ? `channels.${channelName}` : null;
68
81
  const actions = schema?.actions?.filter((action) => action.scope === scope) ?? [];
@@ -71,14 +84,12 @@ export function ChannelForm({ channelName }: ChannelFormProps) {
71
84
  : channelName;
72
85
  const channelMeta = meta?.channels.find((item) => item.name === channelName);
73
86
  const tutorialUrl = channelMeta ? resolveChannelTutorialUrl(channelMeta) : undefined;
74
- const isWeixinChannel = channelName === 'weixin';
75
87
 
76
88
  useEffect(() => {
77
89
  if (channelConfig) {
78
90
  setFormData({ ...channelConfig });
79
91
  const nextDrafts: Record<string, string> = {};
80
- const currentFields = channelName ? buildChannelFields()[channelName] ?? [] : [];
81
- currentFields
92
+ fields
82
93
  .filter((field) => field.type === 'json')
83
94
  .forEach((field) => {
84
95
  const value = channelConfig[field.name];
@@ -89,7 +100,7 @@ export function ChannelForm({ channelName }: ChannelFormProps) {
89
100
  setFormData({});
90
101
  setJsonDrafts({});
91
102
  }
92
- }, [channelConfig, channelName]);
103
+ }, [channelConfig, fields]);
93
104
 
94
105
  const updateField = (name: string, value: unknown) => {
95
106
  setFormData((prev) => ({ ...prev, [name]: value }));
@@ -193,7 +204,7 @@ export function ChannelForm({ channelName }: ChannelFormProps) {
193
204
  );
194
205
  }
195
206
 
196
- const enabled = Boolean(channelConfig.enabled);
207
+ const enabled = typeof formData.enabled === 'boolean' ? formData.enabled : Boolean(channelConfig.enabled);
197
208
 
198
209
  return (
199
210
  <div className={CONFIG_DETAIL_CARD_CLASS}>
@@ -230,45 +241,66 @@ export function ChannelForm({ channelName }: ChannelFormProps) {
230
241
 
231
242
  <form onSubmit={handleSubmit} className="flex min-h-0 flex-1 flex-col">
232
243
  <div className="min-h-0 flex-1 space-y-6 overflow-y-auto overscroll-contain px-6 py-5">
233
- {isWeixinChannel ? (
234
- <>
235
- <WeixinChannelAuthSection
236
- channelConfig={channelConfig}
237
- formData={formData}
238
- disabled={updateChannel.isPending || Boolean(runningActionId)}
239
- />
240
- <details className="group rounded-2xl border border-gray-200/80 bg-white">
241
- <summary className="flex cursor-pointer list-none items-center justify-between gap-3 px-5 py-4 text-sm font-medium text-gray-900">
242
- <div>
243
- <p>{t('weixinAuthAdvancedTitle')}</p>
244
- <p className="mt-1 text-xs font-normal text-gray-500">{t('weixinAuthAdvancedDescription')}</p>
245
- </div>
246
- <ChevronDown className="h-4 w-4 text-gray-400 transition-transform group-open:rotate-180" />
247
- </summary>
248
- <div className="space-y-6 border-t border-gray-100 px-5 py-5">
244
+ {layoutBlocks.map((block, index) => {
245
+ if (block.type === 'fields') {
246
+ const blockFields = resolveFieldsForSection(fields, block.section);
247
+ if (blockFields.length === 0) {
248
+ return null;
249
+ }
250
+ if (!block.collapsible) {
251
+ return (
249
252
  <ChannelFormFieldsSection
253
+ key={`${block.type}-${block.section}-${index}`}
250
254
  channelName={channelName}
251
- fields={fields}
255
+ fields={blockFields}
252
256
  formData={formData}
253
257
  jsonDrafts={jsonDrafts}
254
258
  setJsonDrafts={setJsonDrafts}
255
259
  updateField={updateField}
256
260
  uiHints={uiHints}
257
261
  />
258
- </div>
259
- </details>
260
- </>
261
- ) : (
262
- <ChannelFormFieldsSection
263
- channelName={channelName}
264
- fields={fields}
265
- formData={formData}
266
- jsonDrafts={jsonDrafts}
267
- setJsonDrafts={setJsonDrafts}
268
- updateField={updateField}
269
- uiHints={uiHints}
270
- />
271
- )}
262
+ );
263
+ }
264
+ return (
265
+ <details key={`${block.type}-${block.section}-${index}`} className="group rounded-2xl border border-gray-200/80 bg-white">
266
+ <summary className="flex cursor-pointer list-none items-center justify-between gap-3 px-5 py-4 text-sm font-medium text-gray-900">
267
+ <div>
268
+ <p>{block.collapsible.title}</p>
269
+ {block.collapsible.description ? (
270
+ <p className="mt-1 text-xs font-normal text-gray-500">{block.collapsible.description}</p>
271
+ ) : null}
272
+ </div>
273
+ <ChevronDown className="h-4 w-4 text-gray-400 transition-transform group-open:rotate-180" />
274
+ </summary>
275
+ <div className="space-y-6 border-t border-gray-100 px-5 py-5">
276
+ <ChannelFormFieldsSection
277
+ channelName={channelName}
278
+ fields={blockFields}
279
+ formData={formData}
280
+ jsonDrafts={jsonDrafts}
281
+ setJsonDrafts={setJsonDrafts}
282
+ updateField={updateField}
283
+ uiHints={uiHints}
284
+ />
285
+ </div>
286
+ </details>
287
+ );
288
+ }
289
+
290
+ if (block.sectionId === 'weixin-auth') {
291
+ return (
292
+ <WeixinChannelAuthSection
293
+ key={`${block.type}-${block.sectionId}-${index}`}
294
+ channelConfig={channelConfig}
295
+ formData={formData}
296
+ channelEnabled={enabled}
297
+ disabled={updateChannel.isPending || Boolean(runningActionId)}
298
+ />
299
+ );
300
+ }
301
+
302
+ return null;
303
+ })}
272
304
  </div>
273
305
 
274
306
  <div className="flex flex-wrap items-center justify-between gap-3 border-t border-gray-100 px-6 py-4">
@@ -0,0 +1,28 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { buildChannelFormDefinitions } from './channel-form-fields';
3
+
4
+ describe('buildChannelFormDefinitions', () => {
5
+ it('keeps default channels on a single all-fields layout', () => {
6
+ const definitions = buildChannelFormDefinitions();
7
+
8
+ expect(definitions.telegram?.layout).toBeUndefined();
9
+ expect(definitions.telegram?.fields.some((field) => field.name === 'enabled')).toBe(true);
10
+ });
11
+
12
+ it('declares weixin layout blocks instead of relying on form-level branching', () => {
13
+ const definitions = buildChannelFormDefinitions();
14
+
15
+ expect(definitions.weixin?.layout).toEqual([
16
+ { type: 'fields', section: 'primary' },
17
+ { type: 'custom', sectionId: 'weixin-auth' },
18
+ {
19
+ type: 'fields',
20
+ section: 'advanced',
21
+ collapsible: {
22
+ title: 'Advanced settings',
23
+ description: 'Expand these fields only when you need to customize the API base URL, account mapping, or allowlist.'
24
+ }
25
+ }
26
+ ]);
27
+ });
28
+ });
@@ -2,7 +2,31 @@ import { t } from '@/lib/i18n';
2
2
 
3
3
  export type ChannelFieldType = 'boolean' | 'text' | 'email' | 'password' | 'number' | 'tags' | 'select' | 'json';
4
4
  export type ChannelOption = { value: string; label: string };
5
- export type ChannelField = { name: string; type: ChannelFieldType; label: string; options?: ChannelOption[] };
5
+ export type ChannelField = {
6
+ name: string;
7
+ type: ChannelFieldType;
8
+ label: string;
9
+ options?: ChannelOption[];
10
+ section?: 'primary' | 'advanced';
11
+ };
12
+ export type ChannelFormFieldSection = 'all' | 'primary' | 'advanced';
13
+ export type ChannelFormBlock =
14
+ | {
15
+ type: 'fields';
16
+ section: ChannelFormFieldSection;
17
+ collapsible?: {
18
+ title: string;
19
+ description?: string;
20
+ };
21
+ }
22
+ | {
23
+ type: 'custom';
24
+ sectionId: string;
25
+ };
26
+ export type ChannelFormDefinition = {
27
+ fields: ChannelField[];
28
+ layout?: ChannelFormBlock[];
29
+ };
6
30
 
7
31
  const DM_POLICY_OPTIONS: ChannelOption[] = [
8
32
  { value: 'pairing', label: 'pairing' },
@@ -24,9 +48,10 @@ const STREAMING_MODE_OPTIONS: ChannelOption[] = [
24
48
  { value: 'progress', label: 'progress' }
25
49
  ];
26
50
 
27
- export function buildChannelFields(): Record<string, ChannelField[]> {
51
+ export function buildChannelFormDefinitions(): Record<string, ChannelFormDefinition> {
28
52
  return {
29
- telegram: [
53
+ telegram: {
54
+ fields: [
30
55
  { name: 'enabled', type: 'boolean', label: t('enabled') },
31
56
  { name: 'token', type: 'password', label: t('botToken') },
32
57
  { name: 'allowFrom', type: 'tags', label: t('allowFrom') },
@@ -38,8 +63,10 @@ export function buildChannelFields(): Record<string, ChannelField[]> {
38
63
  { name: 'requireMention', type: 'boolean', label: t('requireMention') },
39
64
  { name: 'mentionPatterns', type: 'tags', label: t('mentionPatterns') },
40
65
  { name: 'groups', type: 'json', label: t('groupRulesJson') }
41
- ],
42
- discord: [
66
+ ]
67
+ },
68
+ discord: {
69
+ fields: [
43
70
  { name: 'enabled', type: 'boolean', label: t('enabled') },
44
71
  { name: 'token', type: 'password', label: t('botToken') },
45
72
  { name: 'allowBots', type: 'boolean', label: t('allowBotMessages') },
@@ -58,13 +85,17 @@ export function buildChannelFields(): Record<string, ChannelField[]> {
58
85
  { name: 'requireMention', type: 'boolean', label: t('requireMention') },
59
86
  { name: 'mentionPatterns', type: 'tags', label: t('mentionPatterns') },
60
87
  { name: 'groups', type: 'json', label: t('groupRulesJson') }
61
- ],
62
- whatsapp: [
88
+ ]
89
+ },
90
+ whatsapp: {
91
+ fields: [
63
92
  { name: 'enabled', type: 'boolean', label: t('enabled') },
64
93
  { name: 'bridgeUrl', type: 'text', label: t('bridgeUrl') },
65
94
  { name: 'allowFrom', type: 'tags', label: t('allowFrom') }
66
- ],
67
- feishu: [
95
+ ]
96
+ },
97
+ feishu: {
98
+ fields: [
68
99
  { name: 'enabled', type: 'boolean', label: t('enabled') },
69
100
  { name: 'appId', type: 'text', label: t('appId') },
70
101
  { name: 'appSecret', type: 'password', label: t('appSecret') },
@@ -79,14 +110,18 @@ export function buildChannelFields(): Record<string, ChannelField[]> {
79
110
  { name: 'mentionPatterns', type: 'tags', label: t('mentionPatterns') },
80
111
  { name: 'groups', type: 'json', label: t('groupRulesJson') },
81
112
  { name: 'accounts', type: 'json', label: t('accountsJson') }
82
- ],
83
- dingtalk: [
113
+ ]
114
+ },
115
+ dingtalk: {
116
+ fields: [
84
117
  { name: 'enabled', type: 'boolean', label: t('enabled') },
85
118
  { name: 'clientId', type: 'text', label: t('clientId') },
86
119
  { name: 'clientSecret', type: 'password', label: t('clientSecret') },
87
120
  { name: 'allowFrom', type: 'tags', label: t('allowFrom') }
88
- ],
89
- wecom: [
121
+ ]
122
+ },
123
+ wecom: {
124
+ fields: [
90
125
  { name: 'enabled', type: 'boolean', label: t('enabled') },
91
126
  { name: 'corpId', type: 'text', label: t('corpId') },
92
127
  { name: 'agentId', type: 'text', label: t('agentId') },
@@ -95,24 +130,42 @@ export function buildChannelFields(): Record<string, ChannelField[]> {
95
130
  { name: 'callbackPort', type: 'number', label: t('callbackPort') },
96
131
  { name: 'callbackPath', type: 'text', label: t('callbackPath') },
97
132
  { name: 'allowFrom', type: 'tags', label: t('allowFrom') }
98
- ],
99
- weixin: [
100
- { name: 'enabled', type: 'boolean', label: t('enabled') },
101
- { name: 'defaultAccountId', type: 'text', label: t('defaultAccountId') },
102
- { name: 'baseUrl', type: 'text', label: t('baseUrl') },
103
- { name: 'pollTimeoutMs', type: 'number', label: t('pollTimeoutMs') },
104
- { name: 'allowFrom', type: 'tags', label: t('allowFrom') },
105
- { name: 'accounts', type: 'json', label: t('accountsJson') }
106
- ],
107
- slack: [
133
+ ]
134
+ },
135
+ weixin: {
136
+ fields: [
137
+ { name: 'enabled', type: 'boolean', label: t('enabled'), section: 'primary' },
138
+ { name: 'defaultAccountId', type: 'text', label: t('defaultAccountId') },
139
+ { name: 'baseUrl', type: 'text', label: t('baseUrl') },
140
+ { name: 'pollTimeoutMs', type: 'number', label: t('pollTimeoutMs') },
141
+ { name: 'allowFrom', type: 'tags', label: t('allowFrom') },
142
+ { name: 'accounts', type: 'json', label: t('accountsJson') }
143
+ ],
144
+ layout: [
145
+ { type: 'fields', section: 'primary' },
146
+ { type: 'custom', sectionId: 'weixin-auth' },
147
+ {
148
+ type: 'fields',
149
+ section: 'advanced',
150
+ collapsible: {
151
+ title: t('weixinAuthAdvancedTitle'),
152
+ description: t('weixinAuthAdvancedDescription')
153
+ }
154
+ }
155
+ ]
156
+ },
157
+ slack: {
158
+ fields: [
108
159
  { name: 'enabled', type: 'boolean', label: t('enabled') },
109
160
  { name: 'mode', type: 'text', label: t('mode') },
110
161
  { name: 'webhookPath', type: 'text', label: t('webhookPath') },
111
162
  { name: 'allowBots', type: 'boolean', label: t('allowBotMessages') },
112
163
  { name: 'botToken', type: 'password', label: t('botToken') },
113
164
  { name: 'appToken', type: 'password', label: t('appToken') }
114
- ],
115
- email: [
165
+ ]
166
+ },
167
+ email: {
168
+ fields: [
116
169
  { name: 'enabled', type: 'boolean', label: t('enabled') },
117
170
  { name: 'consentGranted', type: 'boolean', label: t('consentGranted') },
118
171
  { name: 'imapHost', type: 'text', label: t('imapHost') },
@@ -120,20 +173,32 @@ export function buildChannelFields(): Record<string, ChannelField[]> {
120
173
  { name: 'imapUsername', type: 'text', label: t('imapUsername') },
121
174
  { name: 'imapPassword', type: 'password', label: t('imapPassword') },
122
175
  { name: 'fromAddress', type: 'email', label: t('fromAddress') }
123
- ],
124
- mochat: [
176
+ ]
177
+ },
178
+ mochat: {
179
+ fields: [
125
180
  { name: 'enabled', type: 'boolean', label: t('enabled') },
126
181
  { name: 'baseUrl', type: 'text', label: t('baseUrl') },
127
182
  { name: 'clawToken', type: 'password', label: t('clawToken') },
128
183
  { name: 'agentUserId', type: 'text', label: t('agentUserId') },
129
184
  { name: 'allowFrom', type: 'tags', label: t('allowFrom') }
130
- ],
131
- qq: [
185
+ ]
186
+ },
187
+ qq: {
188
+ fields: [
132
189
  { name: 'enabled', type: 'boolean', label: t('enabled') },
133
190
  { name: 'appId', type: 'text', label: t('appId') },
134
191
  { name: 'secret', type: 'password', label: t('appSecret') },
135
192
  { name: 'markdownSupport', type: 'boolean', label: t('markdownSupport') },
136
193
  { name: 'allowFrom', type: 'tags', label: t('allowFrom') }
137
- ]
194
+ ]
195
+ }
138
196
  };
139
197
  }
198
+
199
+ export function buildChannelFields(): Record<string, ChannelField[]> {
200
+ const definitions = buildChannelFormDefinitions();
201
+ return Object.fromEntries(
202
+ Object.entries(definitions).map(([channelName, definition]) => [channelName, definition.fields])
203
+ );
204
+ }
@@ -59,6 +59,7 @@ describe('WeixinChannelAuthSection', () => {
59
59
  <WeixinChannelAuthSection
60
60
  channelConfig={{ enabled: false }}
61
61
  formData={{}}
62
+ channelEnabled={false}
62
63
  />
63
64
  );
64
65
 
@@ -80,6 +81,7 @@ describe('WeixinChannelAuthSection', () => {
80
81
  }
81
82
  }}
82
83
  formData={{}}
84
+ channelEnabled={true}
83
85
  />
84
86
  );
85
87
 
@@ -88,4 +90,28 @@ describe('WeixinChannelAuthSection', () => {
88
90
  expect(screen.getByRole('button', { name: 'Reconnect with QR' })).toBeTruthy();
89
91
  });
90
92
  });
93
+
94
+ it('shows connected-but-inactive state when account is authorized but channel is disabled', async () => {
95
+ render(
96
+ <WeixinChannelAuthSection
97
+ channelConfig={{
98
+ enabled: false,
99
+ defaultAccountId: 'bot-1@im.bot',
100
+ accounts: {
101
+ 'bot-1@im.bot': {
102
+ enabled: true
103
+ }
104
+ }
105
+ }}
106
+ formData={{ enabled: false }}
107
+ channelEnabled={false}
108
+ />
109
+ );
110
+
111
+ expect(screen.getByText('Connected, but channel inactive')).toBeTruthy();
112
+ expect(
113
+ screen.getByText('This account is connected, but the channel is inactive. Turn on Enabled before it can send or receive messages.')
114
+ ).toBeTruthy();
115
+ expect(screen.getByRole('button', { name: 'Reconnect with QR' })).toBeTruthy();
116
+ });
91
117
  });
@@ -12,6 +12,7 @@ import type { ChannelAuthPollResult, ChannelAuthStartResult } from '@/api/channe
12
12
  type WeixinChannelAuthSectionProps = {
13
13
  channelConfig: Record<string, unknown>;
14
14
  formData: Record<string, unknown>;
15
+ channelEnabled: boolean;
15
16
  disabled?: boolean;
16
17
  };
17
18
 
@@ -45,6 +46,7 @@ function resolveBaseUrl(formData: Record<string, unknown>, channelConfig: Record
45
46
  export function WeixinChannelAuthSection({
46
47
  channelConfig,
47
48
  formData,
49
+ channelEnabled,
48
50
  disabled = false
49
51
  }: WeixinChannelAuthSectionProps) {
50
52
  const queryClient = useQueryClient();
@@ -192,7 +194,9 @@ export function WeixinChannelAuthSection({
192
194
  ? t('weixinAuthScanned')
193
195
  : t('weixinAuthWaiting')
194
196
  : hasConnectedAccount
195
- ? t('weixinAuthAuthorized')
197
+ ? channelEnabled
198
+ ? t('weixinAuthAuthorized')
199
+ : t('weixinAuthConnectedDisabled')
196
200
  : t('weixinAuthNotConnected');
197
201
 
198
202
  const connectButtonLabel = startChannelAuth.isPending
@@ -229,7 +233,7 @@ export function WeixinChannelAuthSection({
229
233
  {statusLabel}
230
234
  </div>
231
235
  <div className="space-y-1 text-sm text-gray-600">
232
- <p>{t('weixinAuthCapabilityHint')}</p>
236
+ <p>{channelEnabled || !hasConnectedAccount ? t('weixinAuthCapabilityHint') : t('weixinAuthDisabledHint')}</p>
233
237
  {primaryAccountId ? (
234
238
  <p>
235
239
  {t('weixinAuthPrimaryAccount')}: <span className="font-mono text-xs text-gray-900">{primaryAccountId}</span>
@@ -18,7 +18,12 @@ export const CHANNEL_AUTH_LABELS: Record<string, { zh: string; en: string }> = {
18
18
  weixinAuthWaiting: { zh: '等待扫码确认', en: 'Waiting for scan confirmation' },
19
19
  weixinAuthScanned: { zh: '已扫码,等待确认', en: 'Scanned, waiting for confirmation' },
20
20
  weixinAuthAuthorized: { zh: '已连接', en: 'Connected' },
21
+ weixinAuthConnectedDisabled: { zh: '已连接,但渠道未启用', en: 'Connected, but channel inactive' },
21
22
  weixinAuthNotConnected: { zh: '未连接', en: 'Not connected' },
23
+ weixinAuthDisabledHint: {
24
+ zh: '当前账号已完成扫码连接,但渠道处于未启用状态。打开 Enabled 后才会开始收发消息。',
25
+ en: 'This account is connected, but the channel is inactive. Turn on Enabled before it can send or receive messages.'
26
+ },
22
27
  weixinAuthRetryRequired: { zh: '二维码已失效,请重新扫码。', en: 'QR session expired. Please start again.' },
23
28
  weixinAuthQrAlt: { zh: '微信登录二维码', en: 'Weixin login QR code' },
24
29
  weixinAuthScanPrompt: { zh: '请用微信扫码,并在手机上确认登录。', en: 'Scan with Weixin and confirm the login on your phone.' },
@@ -1,8 +0,0 @@
1
- import{_ as e,a as t,h as n,l as r,m as i,p as a,r as o,u as s}from"./i18n-Cn8SErDV.js";import{n as c,o as l,r as u,u as d}from"./dist-Cy668qFZ.js";import{t as f}from"./useMutation-BpXHE2OV.js";import{O as p,a as m,i as h,n as g,r as _,t as v}from"./select-D60QRHg9.js";import{t as y}from"./createLucideIcon-B8FV3fzy.js";import{t as b}from"./book-open-1agbn9dT.js";import{t as x}from"./external-link-DI4ZmR3r.js";import{n as S,t as C}from"./logos-DjrINZ7P.js";import{t as w}from"./hash-DoXBhX9w.js";import{t as T}from"./loader-circle-d_mzMi2S.js";import{t as E}from"./search-CQCQaN4Z.js";import{t as D}from"./x-C8AWDn7c.js";import{T as ee,U as O,c as k,ct as A,g as te,l as j,pt as M,u as N,ut as P}from"./index-bAeWRAyo.js";import{t as F}from"./LogoBadge-DRDmIa7o.js";import{n as I,t as ne}from"./page-layout-Hr-Dvq4o.js";import{t as re}from"./tabs-custom-UTbefkqB.js";import{t as L}from"./status-dot-D43lBF1a.js";import{t as R}from"./config-hints-fGnUjDe9.js";import{i as ie,n as ae,r as oe,t as se}from"./config-layout-B-7erZRN.js";import{t as ce}from"./label-Cz0q8fx4.js";import{t as le}from"./switch-CcBS0F3U.js";var ue=y(`Mail`,[[`rect`,{width:`20`,height:`16`,x:`2`,y:`4`,rx:`2`,key:`18n3k1`}],[`path`,{d:`m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7`,key:`1ocrg3`}]]),de=y(`MessageCircleMore`,[[`path`,{d:`M7.9 20A9 9 0 1 0 4 16.1L2 22Z`,key:`vv11sd`}],[`path`,{d:`M8 12h.01`,key:`czm47f`}],[`path`,{d:`M12 12h.01`,key:`1mp3jc`}],[`path`,{d:`M16 12h.01`,key:`1l6xoz`}]]),fe=y(`QrCode`,[[`rect`,{width:`5`,height:`5`,x:`3`,y:`3`,rx:`1`,key:`1tu5fj`}],[`rect`,{width:`5`,height:`5`,x:`16`,y:`3`,rx:`1`,key:`1v8r4q`}],[`rect`,{width:`5`,height:`5`,x:`3`,y:`16`,rx:`1`,key:`1x03jg`}],[`path`,{d:`M21 16h-3a2 2 0 0 0-2 2v3`,key:`177gqh`}],[`path`,{d:`M21 21v.01`,key:`ents32`}],[`path`,{d:`M12 7v3a2 2 0 0 1-2 2H7`,key:`8crl2c`}],[`path`,{d:`M3 12h.01`,key:`nlz23k`}],[`path`,{d:`M12 3h.01`,key:`n36tog`}],[`path`,{d:`M12 16v.01`,key:`133mhm`}],[`path`,{d:`M16 12h1`,key:`1slzba`}],[`path`,{d:`M21 12v.01`,key:`1lwtk9`}],[`path`,{d:`M12 21v-1`,key:`1880an`}]]),pe=y(`ToggleLeft`,[[`rect`,{width:`20`,height:`12`,x:`2`,y:`6`,rx:`6`,ry:`6`,key:`f2vt7d`}],[`circle`,{cx:`8`,cy:`12`,r:`2`,key:`1nvbw3`}]]),z=e(i(),1);function B(e){let n=t();return e.tutorialUrls?.[n]||e.tutorialUrls?.default||e.tutorialUrl}var V=a();function me({value:e,onChange:t,className:n,placeholder:i=``}){let[a,o]=(0,z.useState)(``),c=n=>{n.key===`Enter`&&a.trim()?(n.preventDefault(),t([...e,a.trim()]),o(``)):n.key===`Backspace`&&!a&&e.length>0&&t(e.slice(0,-1))},l=n=>{t(e.filter((e,t)=>t!==n))};return(0,V.jsxs)(`div`,{className:s(`flex flex-wrap gap-2 p-2 border rounded-md min-h-[42px]`,n),children:[e.map((e,t)=>(0,V.jsxs)(`span`,{className:`inline-flex items-center gap-1 px-2 py-1 bg-primary text-primary-foreground rounded text-sm`,children:[e,(0,V.jsx)(`button`,{type:`button`,onClick:()=>l(t),className:`hover:text-red-300 transition-colors`,children:(0,V.jsx)(D,{className:`h-3 w-3`})})]},t)),(0,V.jsx)(`input`,{type:`text`,value:a,onChange:e=>o(e.target.value),onKeyDown:c,className:`flex-1 outline-none min-w-[100px] bg-transparent text-sm`,placeholder:i||r(`enterTag`)})]})}function he(e){return e.includes(`token`)||e.includes(`secret`)||e.includes(`password`)?(0,V.jsx)(M,{className:`h-3.5 w-3.5 text-gray-500`}):e.includes(`url`)||e.includes(`host`)?(0,V.jsx)(S,{className:`h-3.5 w-3.5 text-gray-500`}):e.includes(`email`)||e.includes(`mail`)?(0,V.jsx)(ue,{className:`h-3.5 w-3.5 text-gray-500`}):e.includes(`id`)||e.includes(`from`)?(0,V.jsx)(w,{className:`h-3.5 w-3.5 text-gray-500`}):e===`enabled`||e===`consentGranted`?(0,V.jsx)(pe,{className:`h-3.5 w-3.5 text-gray-500`}):(0,V.jsx)(A,{className:`h-3.5 w-3.5 text-gray-500`})}function H({channelName:e,fields:t,formData:n,jsonDrafts:i,setJsonDrafts:a,updateField:o,uiHints:s}){return(0,V.jsx)(V.Fragment,{children:t.map(t=>{let c=R(`channels.${e}.${t.name}`,s),l=c?.label??t.label,u=c?.placeholder;return(0,V.jsxs)(`div`,{className:`space-y-2.5`,children:[(0,V.jsxs)(ce,{htmlFor:t.name,className:`flex items-center gap-2 text-sm font-medium text-gray-900`,children:[he(t.name),l]}),t.type===`boolean`&&(0,V.jsxs)(`div`,{className:`flex items-center justify-between rounded-xl bg-gray-50 p-3`,children:[(0,V.jsx)(`span`,{className:`text-sm text-gray-500`,children:n[t.name]?r(`enabled`):r(`disabled`)}),(0,V.jsx)(le,{id:t.name,checked:n[t.name]||!1,onCheckedChange:e=>o(t.name,e),className:`data-[state=checked]:bg-emerald-500`})]}),(t.type===`text`||t.type===`email`)&&(0,V.jsx)(O,{id:t.name,type:t.type,value:n[t.name]||``,onChange:e=>o(t.name,e.target.value),placeholder:u,className:`rounded-xl`}),t.type===`password`&&(0,V.jsx)(O,{id:t.name,type:`password`,value:n[t.name]||``,onChange:e=>o(t.name,e.target.value),placeholder:u??r(`leaveBlankToKeepUnchanged`),className:`rounded-xl`}),t.type===`number`&&(0,V.jsx)(O,{id:t.name,type:`number`,value:n[t.name]||0,onChange:e=>o(t.name,parseInt(e.target.value,10)||0),placeholder:u,className:`rounded-xl`}),t.type===`tags`&&(0,V.jsx)(me,{value:n[t.name]||[],onChange:e=>o(t.name,e)}),t.type===`select`&&(0,V.jsxs)(v,{value:n[t.name]||``,onValueChange:e=>o(t.name,e),children:[(0,V.jsx)(h,{className:`rounded-xl`,children:(0,V.jsx)(m,{})}),(0,V.jsx)(g,{children:(t.options??[]).map(e=>(0,V.jsx)(_,{value:e.value,children:e.label},e.value))})]}),t.type===`json`&&(0,V.jsx)(`textarea`,{id:t.name,value:i[t.name]??`{}`,onChange:e=>a(n=>({...n,[t.name]:e.target.value})),className:`min-h-[120px] w-full resize-none rounded-lg border border-gray-200 bg-white px-3 py-2 text-xs font-mono`})]},t.name)})})}var U=[{value:`pairing`,label:`pairing`},{value:`allowlist`,label:`allowlist`},{value:`open`,label:`open`},{value:`disabled`,label:`disabled`}],W=[{value:`open`,label:`open`},{value:`allowlist`,label:`allowlist`},{value:`disabled`,label:`disabled`}],ge=[{value:`off`,label:`off`},{value:`partial`,label:`partial`},{value:`block`,label:`block`},{value:`progress`,label:`progress`}];function G(){return{telegram:[{name:`enabled`,type:`boolean`,label:r(`enabled`)},{name:`token`,type:`password`,label:r(`botToken`)},{name:`allowFrom`,type:`tags`,label:r(`allowFrom`)},{name:`proxy`,type:`text`,label:r(`proxy`)},{name:`accountId`,type:`text`,label:r(`accountId`)},{name:`dmPolicy`,type:`select`,label:r(`dmPolicy`),options:U},{name:`groupPolicy`,type:`select`,label:r(`groupPolicy`),options:W},{name:`groupAllowFrom`,type:`tags`,label:r(`groupAllowFrom`)},{name:`requireMention`,type:`boolean`,label:r(`requireMention`)},{name:`mentionPatterns`,type:`tags`,label:r(`mentionPatterns`)},{name:`groups`,type:`json`,label:r(`groupRulesJson`)}],discord:[{name:`enabled`,type:`boolean`,label:r(`enabled`)},{name:`token`,type:`password`,label:r(`botToken`)},{name:`allowBots`,type:`boolean`,label:r(`allowBotMessages`)},{name:`allowFrom`,type:`tags`,label:r(`allowFrom`)},{name:`gatewayUrl`,type:`text`,label:r(`gatewayUrl`)},{name:`intents`,type:`number`,label:r(`intents`)},{name:`proxy`,type:`text`,label:r(`proxy`)},{name:`mediaMaxMb`,type:`number`,label:r(`attachmentMaxSizeMb`)},{name:`streaming`,type:`select`,label:r(`streamingMode`),options:ge},{name:`draftChunk`,type:`json`,label:r(`draftChunkingJson`)},{name:`textChunkLimit`,type:`number`,label:r(`textChunkLimit`)},{name:`accountId`,type:`text`,label:r(`accountId`)},{name:`dmPolicy`,type:`select`,label:r(`dmPolicy`),options:U},{name:`groupPolicy`,type:`select`,label:r(`groupPolicy`),options:W},{name:`groupAllowFrom`,type:`tags`,label:r(`groupAllowFrom`)},{name:`requireMention`,type:`boolean`,label:r(`requireMention`)},{name:`mentionPatterns`,type:`tags`,label:r(`mentionPatterns`)},{name:`groups`,type:`json`,label:r(`groupRulesJson`)}],whatsapp:[{name:`enabled`,type:`boolean`,label:r(`enabled`)},{name:`bridgeUrl`,type:`text`,label:r(`bridgeUrl`)},{name:`allowFrom`,type:`tags`,label:r(`allowFrom`)}],feishu:[{name:`enabled`,type:`boolean`,label:r(`enabled`)},{name:`appId`,type:`text`,label:r(`appId`)},{name:`appSecret`,type:`password`,label:r(`appSecret`)},{name:`encryptKey`,type:`password`,label:r(`encryptKey`)},{name:`verificationToken`,type:`password`,label:r(`verificationToken`)},{name:`domain`,type:`text`,label:`Domain`},{name:`allowFrom`,type:`tags`,label:r(`allowFrom`)},{name:`dmPolicy`,type:`select`,label:r(`dmPolicy`),options:U},{name:`groupPolicy`,type:`select`,label:r(`groupPolicy`),options:W},{name:`groupAllowFrom`,type:`tags`,label:r(`groupAllowFrom`)},{name:`requireMention`,type:`boolean`,label:r(`requireMention`)},{name:`mentionPatterns`,type:`tags`,label:r(`mentionPatterns`)},{name:`groups`,type:`json`,label:r(`groupRulesJson`)},{name:`accounts`,type:`json`,label:r(`accountsJson`)}],dingtalk:[{name:`enabled`,type:`boolean`,label:r(`enabled`)},{name:`clientId`,type:`text`,label:r(`clientId`)},{name:`clientSecret`,type:`password`,label:r(`clientSecret`)},{name:`allowFrom`,type:`tags`,label:r(`allowFrom`)}],wecom:[{name:`enabled`,type:`boolean`,label:r(`enabled`)},{name:`corpId`,type:`text`,label:r(`corpId`)},{name:`agentId`,type:`text`,label:r(`agentId`)},{name:`secret`,type:`password`,label:r(`secret`)},{name:`token`,type:`password`,label:r(`token`)},{name:`callbackPort`,type:`number`,label:r(`callbackPort`)},{name:`callbackPath`,type:`text`,label:r(`callbackPath`)},{name:`allowFrom`,type:`tags`,label:r(`allowFrom`)}],weixin:[{name:`enabled`,type:`boolean`,label:r(`enabled`)},{name:`defaultAccountId`,type:`text`,label:r(`defaultAccountId`)},{name:`baseUrl`,type:`text`,label:r(`baseUrl`)},{name:`pollTimeoutMs`,type:`number`,label:r(`pollTimeoutMs`)},{name:`allowFrom`,type:`tags`,label:r(`allowFrom`)},{name:`accounts`,type:`json`,label:r(`accountsJson`)}],slack:[{name:`enabled`,type:`boolean`,label:r(`enabled`)},{name:`mode`,type:`text`,label:r(`mode`)},{name:`webhookPath`,type:`text`,label:r(`webhookPath`)},{name:`allowBots`,type:`boolean`,label:r(`allowBotMessages`)},{name:`botToken`,type:`password`,label:r(`botToken`)},{name:`appToken`,type:`password`,label:r(`appToken`)}],email:[{name:`enabled`,type:`boolean`,label:r(`enabled`)},{name:`consentGranted`,type:`boolean`,label:r(`consentGranted`)},{name:`imapHost`,type:`text`,label:r(`imapHost`)},{name:`imapPort`,type:`number`,label:r(`imapPort`)},{name:`imapUsername`,type:`text`,label:r(`imapUsername`)},{name:`imapPassword`,type:`password`,label:r(`imapPassword`)},{name:`fromAddress`,type:`email`,label:r(`fromAddress`)}],mochat:[{name:`enabled`,type:`boolean`,label:r(`enabled`)},{name:`baseUrl`,type:`text`,label:r(`baseUrl`)},{name:`clawToken`,type:`password`,label:r(`clawToken`)},{name:`agentUserId`,type:`text`,label:r(`agentUserId`)},{name:`allowFrom`,type:`tags`,label:r(`allowFrom`)}],qq:[{name:`enabled`,type:`boolean`,label:r(`enabled`)},{name:`appId`,type:`text`,label:r(`appId`)},{name:`secret`,type:`password`,label:r(`appSecret`)},{name:`markdownSupport`,type:`boolean`,label:r(`markdownSupport`)},{name:`allowFrom`,type:`tags`,label:r(`allowFrom`)}]}}var _e=n(((e,t)=>{t.exports=function(){return typeof Promise==`function`&&Promise.prototype&&Promise.prototype.then}})),K=n((e=>{var t,n=[0,26,44,70,100,134,172,196,242,292,346,404,466,532,581,655,733,815,901,991,1085,1156,1258,1364,1474,1588,1706,1828,1921,2051,2185,2323,2465,2611,2761,2876,3034,3196,3362,3532,3706];e.getSymbolSize=function(e){if(!e)throw Error(`"version" cannot be null or undefined`);if(e<1||e>40)throw Error(`"version" should be in range from 1 to 40`);return e*4+17},e.getSymbolTotalCodewords=function(e){return n[e]},e.getBCHDigit=function(e){let t=0;for(;e!==0;)t++,e>>>=1;return t},e.setToSJISFunction=function(e){if(typeof e!=`function`)throw Error(`"toSJISFunc" is not a valid function.`);t=e},e.isKanjiModeEnabled=function(){return t!==void 0},e.toSJIS=function(e){return t(e)}})),q=n((e=>{e.L={bit:1},e.M={bit:0},e.Q={bit:3},e.H={bit:2};function t(t){if(typeof t!=`string`)throw Error(`Param is not a string`);switch(t.toLowerCase()){case`l`:case`low`:return e.L;case`m`:case`medium`:return e.M;case`q`:case`quartile`:return e.Q;case`h`:case`high`:return e.H;default:throw Error(`Unknown EC Level: `+t)}}e.isValid=function(e){return e&&e.bit!==void 0&&e.bit>=0&&e.bit<4},e.from=function(n,r){if(e.isValid(n))return n;try{return t(n)}catch{return r}}})),ve=n(((e,t)=>{function n(){this.buffer=[],this.length=0}n.prototype={get:function(e){let t=Math.floor(e/8);return(this.buffer[t]>>>7-e%8&1)==1},put:function(e,t){for(let n=0;n<t;n++)this.putBit((e>>>t-n-1&1)==1)},getLengthInBits:function(){return this.length},putBit:function(e){let t=Math.floor(this.length/8);this.buffer.length<=t&&this.buffer.push(0),e&&(this.buffer[t]|=128>>>this.length%8),this.length++}},t.exports=n})),ye=n(((e,t)=>{function n(e){if(!e||e<1)throw Error(`BitMatrix size must be defined and greater than 0`);this.size=e,this.data=new Uint8Array(e*e),this.reservedBit=new Uint8Array(e*e)}n.prototype.set=function(e,t,n,r){let i=e*this.size+t;this.data[i]=n,r&&(this.reservedBit[i]=!0)},n.prototype.get=function(e,t){return this.data[e*this.size+t]},n.prototype.xor=function(e,t,n){this.data[e*this.size+t]^=n},n.prototype.isReserved=function(e,t){return this.reservedBit[e*this.size+t]},t.exports=n})),be=n((e=>{var t=K().getSymbolSize;e.getRowColCoords=function(e){if(e===1)return[];let n=Math.floor(e/7)+2,r=t(e),i=r===145?26:Math.ceil((r-13)/(2*n-2))*2,a=[r-7];for(let e=1;e<n-1;e++)a[e]=a[e-1]-i;return a.push(6),a.reverse()},e.getPositions=function(t){let n=[],r=e.getRowColCoords(t),i=r.length;for(let e=0;e<i;e++)for(let t=0;t<i;t++)e===0&&t===0||e===0&&t===i-1||e===i-1&&t===0||n.push([r[e],r[t]]);return n}})),xe=n((e=>{var t=K().getSymbolSize,n=7;e.getPositions=function(e){let r=t(e);return[[0,0],[r-n,0],[0,r-n]]}})),Se=n((e=>{e.Patterns={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7};var t={N1:3,N2:3,N3:40,N4:10};e.isValid=function(e){return e!=null&&e!==``&&!isNaN(e)&&e>=0&&e<=7},e.from=function(t){return e.isValid(t)?parseInt(t,10):void 0},e.getPenaltyN1=function(e){let n=e.size,r=0,i=0,a=0,o=null,s=null;for(let c=0;c<n;c++){i=a=0,o=s=null;for(let l=0;l<n;l++){let n=e.get(c,l);n===o?i++:(i>=5&&(r+=t.N1+(i-5)),o=n,i=1),n=e.get(l,c),n===s?a++:(a>=5&&(r+=t.N1+(a-5)),s=n,a=1)}i>=5&&(r+=t.N1+(i-5)),a>=5&&(r+=t.N1+(a-5))}return r},e.getPenaltyN2=function(e){let n=e.size,r=0;for(let t=0;t<n-1;t++)for(let i=0;i<n-1;i++){let n=e.get(t,i)+e.get(t,i+1)+e.get(t+1,i)+e.get(t+1,i+1);(n===4||n===0)&&r++}return r*t.N2},e.getPenaltyN3=function(e){let n=e.size,r=0,i=0,a=0;for(let t=0;t<n;t++){i=a=0;for(let o=0;o<n;o++)i=i<<1&2047|e.get(t,o),o>=10&&(i===1488||i===93)&&r++,a=a<<1&2047|e.get(o,t),o>=10&&(a===1488||a===93)&&r++}return r*t.N3},e.getPenaltyN4=function(e){let n=0,r=e.data.length;for(let t=0;t<r;t++)n+=e.data[t];return Math.abs(Math.ceil(n*100/r/5)-10)*t.N4};function n(t,n,r){switch(t){case e.Patterns.PATTERN000:return(n+r)%2==0;case e.Patterns.PATTERN001:return n%2==0;case e.Patterns.PATTERN010:return r%3==0;case e.Patterns.PATTERN011:return(n+r)%3==0;case e.Patterns.PATTERN100:return(Math.floor(n/2)+Math.floor(r/3))%2==0;case e.Patterns.PATTERN101:return n*r%2+n*r%3==0;case e.Patterns.PATTERN110:return(n*r%2+n*r%3)%2==0;case e.Patterns.PATTERN111:return(n*r%3+(n+r)%2)%2==0;default:throw Error(`bad maskPattern:`+t)}}e.applyMask=function(e,t){let r=t.size;for(let i=0;i<r;i++)for(let a=0;a<r;a++)t.isReserved(a,i)||t.xor(a,i,n(e,a,i))},e.getBestMask=function(t,n){let r=Object.keys(e.Patterns).length,i=0,a=1/0;for(let o=0;o<r;o++){n(o),e.applyMask(o,t);let r=e.getPenaltyN1(t)+e.getPenaltyN2(t)+e.getPenaltyN3(t)+e.getPenaltyN4(t);e.applyMask(o,t),r<a&&(a=r,i=o)}return i}})),J=n((e=>{var t=q(),n=[1,1,1,1,1,1,1,1,1,1,2,2,1,2,2,4,1,2,4,4,2,4,4,4,2,4,6,5,2,4,6,6,2,5,8,8,4,5,8,8,4,5,8,11,4,8,10,11,4,9,12,16,4,9,16,16,6,10,12,18,6,10,17,16,6,11,16,19,6,13,18,21,7,14,21,25,8,16,20,25,8,17,23,25,9,17,23,34,9,18,25,30,10,20,27,32,12,21,29,35,12,23,34,37,12,25,34,40,13,26,35,42,14,28,38,45,15,29,40,48,16,31,43,51,17,33,45,54,18,35,48,57,19,37,51,60,19,38,53,63,20,40,56,66,21,43,59,70,22,45,62,74,24,47,65,77,25,49,68,81],r=[7,10,13,17,10,16,22,28,15,26,36,44,20,36,52,64,26,48,72,88,36,64,96,112,40,72,108,130,48,88,132,156,60,110,160,192,72,130,192,224,80,150,224,264,96,176,260,308,104,198,288,352,120,216,320,384,132,240,360,432,144,280,408,480,168,308,448,532,180,338,504,588,196,364,546,650,224,416,600,700,224,442,644,750,252,476,690,816,270,504,750,900,300,560,810,960,312,588,870,1050,336,644,952,1110,360,700,1020,1200,390,728,1050,1260,420,784,1140,1350,450,812,1200,1440,480,868,1290,1530,510,924,1350,1620,540,980,1440,1710,570,1036,1530,1800,570,1064,1590,1890,600,1120,1680,1980,630,1204,1770,2100,660,1260,1860,2220,720,1316,1950,2310,750,1372,2040,2430];e.getBlocksCount=function(e,r){switch(r){case t.L:return n[(e-1)*4+0];case t.M:return n[(e-1)*4+1];case t.Q:return n[(e-1)*4+2];case t.H:return n[(e-1)*4+3];default:return}},e.getTotalCodewordsCount=function(e,n){switch(n){case t.L:return r[(e-1)*4+0];case t.M:return r[(e-1)*4+1];case t.Q:return r[(e-1)*4+2];case t.H:return r[(e-1)*4+3];default:return}}})),Ce=n((e=>{var t=new Uint8Array(512),n=new Uint8Array(256);(function(){let e=1;for(let r=0;r<255;r++)t[r]=e,n[e]=r,e<<=1,e&256&&(e^=285);for(let e=255;e<512;e++)t[e]=t[e-255]})(),e.log=function(e){if(e<1)throw Error(`log(`+e+`)`);return n[e]},e.exp=function(e){return t[e]},e.mul=function(e,r){return e===0||r===0?0:t[n[e]+n[r]]}})),we=n((e=>{var t=Ce();e.mul=function(e,n){let r=new Uint8Array(e.length+n.length-1);for(let i=0;i<e.length;i++)for(let a=0;a<n.length;a++)r[i+a]^=t.mul(e[i],n[a]);return r},e.mod=function(e,n){let r=new Uint8Array(e);for(;r.length-n.length>=0;){let e=r[0];for(let i=0;i<n.length;i++)r[i]^=t.mul(n[i],e);let i=0;for(;i<r.length&&r[i]===0;)i++;r=r.slice(i)}return r},e.generateECPolynomial=function(n){let r=new Uint8Array([1]);for(let i=0;i<n;i++)r=e.mul(r,new Uint8Array([1,t.exp(i)]));return r}})),Te=n(((e,t)=>{var n=we();function r(e){this.genPoly=void 0,this.degree=e,this.degree&&this.initialize(this.degree)}r.prototype.initialize=function(e){this.degree=e,this.genPoly=n.generateECPolynomial(this.degree)},r.prototype.encode=function(e){if(!this.genPoly)throw Error(`Encoder not initialized`);let t=new Uint8Array(e.length+this.degree);t.set(e);let r=n.mod(t,this.genPoly),i=this.degree-r.length;if(i>0){let e=new Uint8Array(this.degree);return e.set(r,i),e}return r},t.exports=r})),Y=n((e=>{e.isValid=function(e){return!isNaN(e)&&e>=1&&e<=40}})),X=n((e=>{var t=`[0-9]+`,n=`[A-Z $%*+\\-./:]+`,r=`(?:[u3000-u303F]|[u3040-u309F]|[u30A0-u30FF]|[uFF00-uFFEF]|[u4E00-u9FAF]|[u2605-u2606]|[u2190-u2195]|u203B|[u2010u2015u2018u2019u2025u2026u201Cu201Du2225u2260]|[u0391-u0451]|[u00A7u00A8u00B1u00B4u00D7u00F7])+`;r=r.replace(/u/g,`\\u`);var i=`(?:(?![A-Z0-9 $%*+\\-./:]|`+r+`)(?:.|[\r
2
- ]))+`;e.KANJI=new RegExp(r,`g`),e.BYTE_KANJI=RegExp(`[^A-Z0-9 $%*+\\-./:]+`,`g`),e.BYTE=new RegExp(i,`g`),e.NUMERIC=new RegExp(t,`g`),e.ALPHANUMERIC=new RegExp(n,`g`);var a=RegExp(`^`+r+`$`),o=RegExp(`^`+t+`$`),s=RegExp(`^[A-Z0-9 $%*+\\-./:]+$`);e.testKanji=function(e){return a.test(e)},e.testNumeric=function(e){return o.test(e)},e.testAlphanumeric=function(e){return s.test(e)}})),Z=n((e=>{var t=Y(),n=X();e.NUMERIC={id:`Numeric`,bit:1,ccBits:[10,12,14]},e.ALPHANUMERIC={id:`Alphanumeric`,bit:2,ccBits:[9,11,13]},e.BYTE={id:`Byte`,bit:4,ccBits:[8,16,16]},e.KANJI={id:`Kanji`,bit:8,ccBits:[8,10,12]},e.MIXED={bit:-1},e.getCharCountIndicator=function(e,n){if(!e.ccBits)throw Error(`Invalid mode: `+e);if(!t.isValid(n))throw Error(`Invalid version: `+n);return n>=1&&n<10?e.ccBits[0]:n<27?e.ccBits[1]:e.ccBits[2]},e.getBestModeForData=function(t){return n.testNumeric(t)?e.NUMERIC:n.testAlphanumeric(t)?e.ALPHANUMERIC:n.testKanji(t)?e.KANJI:e.BYTE},e.toString=function(e){if(e&&e.id)return e.id;throw Error(`Invalid mode`)},e.isValid=function(e){return e&&e.bit&&e.ccBits};function r(t){if(typeof t!=`string`)throw Error(`Param is not a string`);switch(t.toLowerCase()){case`numeric`:return e.NUMERIC;case`alphanumeric`:return e.ALPHANUMERIC;case`kanji`:return e.KANJI;case`byte`:return e.BYTE;default:throw Error(`Unknown mode: `+t)}}e.from=function(t,n){if(e.isValid(t))return t;try{return r(t)}catch{return n}}})),Ee=n((e=>{var t=K(),n=J(),r=q(),i=Z(),a=Y(),o=7973,s=t.getBCHDigit(o);function c(t,n,r){for(let i=1;i<=40;i++)if(n<=e.getCapacity(i,r,t))return i}function l(e,t){return i.getCharCountIndicator(e,t)+4}function u(e,t){let n=0;return e.forEach(function(e){let r=l(e.mode,t);n+=r+e.getBitsLength()}),n}function d(t,n){for(let r=1;r<=40;r++)if(u(t,r)<=e.getCapacity(r,n,i.MIXED))return r}e.from=function(e,t){return a.isValid(e)?parseInt(e,10):t},e.getCapacity=function(e,r,o){if(!a.isValid(e))throw Error(`Invalid QR Code version`);o===void 0&&(o=i.BYTE);let s=(t.getSymbolTotalCodewords(e)-n.getTotalCodewordsCount(e,r))*8;if(o===i.MIXED)return s;let c=s-l(o,e);switch(o){case i.NUMERIC:return Math.floor(c/10*3);case i.ALPHANUMERIC:return Math.floor(c/11*2);case i.KANJI:return Math.floor(c/13);case i.BYTE:default:return Math.floor(c/8)}},e.getBestVersionForData=function(e,t){let n,i=r.from(t,r.M);if(Array.isArray(e)){if(e.length>1)return d(e,i);if(e.length===0)return 1;n=e[0]}else n=e;return c(n.mode,n.getLength(),i)},e.getEncodedBits=function(e){if(!a.isValid(e)||e<7)throw Error(`Invalid QR Code version`);let n=e<<12;for(;t.getBCHDigit(n)-s>=0;)n^=o<<t.getBCHDigit(n)-s;return e<<12|n}})),De=n((e=>{var t=K(),n=1335,r=21522,i=t.getBCHDigit(n);e.getEncodedBits=function(e,a){let o=e.bit<<3|a,s=o<<10;for(;t.getBCHDigit(s)-i>=0;)s^=n<<t.getBCHDigit(s)-i;return(o<<10|s)^r}})),Oe=n(((e,t)=>{var n=Z();function r(e){this.mode=n.NUMERIC,this.data=e.toString()}r.getBitsLength=function(e){return 10*Math.floor(e/3)+(e%3?e%3*3+1:0)},r.prototype.getLength=function(){return this.data.length},r.prototype.getBitsLength=function(){return r.getBitsLength(this.data.length)},r.prototype.write=function(e){let t,n,r;for(t=0;t+3<=this.data.length;t+=3)n=this.data.substr(t,3),r=parseInt(n,10),e.put(r,10);let i=this.data.length-t;i>0&&(n=this.data.substr(t),r=parseInt(n,10),e.put(r,i*3+1))},t.exports=r})),ke=n(((e,t)=>{var n=Z(),r=`0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:`.split(``);function i(e){this.mode=n.ALPHANUMERIC,this.data=e}i.getBitsLength=function(e){return 11*Math.floor(e/2)+e%2*6},i.prototype.getLength=function(){return this.data.length},i.prototype.getBitsLength=function(){return i.getBitsLength(this.data.length)},i.prototype.write=function(e){let t;for(t=0;t+2<=this.data.length;t+=2){let n=r.indexOf(this.data[t])*45;n+=r.indexOf(this.data[t+1]),e.put(n,11)}this.data.length%2&&e.put(r.indexOf(this.data[t]),6)},t.exports=i})),Ae=n(((e,t)=>{var n=Z();function r(e){this.mode=n.BYTE,typeof e==`string`?this.data=new TextEncoder().encode(e):this.data=new Uint8Array(e)}r.getBitsLength=function(e){return e*8},r.prototype.getLength=function(){return this.data.length},r.prototype.getBitsLength=function(){return r.getBitsLength(this.data.length)},r.prototype.write=function(e){for(let t=0,n=this.data.length;t<n;t++)e.put(this.data[t],8)},t.exports=r})),je=n(((e,t)=>{var n=Z(),r=K();function i(e){this.mode=n.KANJI,this.data=e}i.getBitsLength=function(e){return e*13},i.prototype.getLength=function(){return this.data.length},i.prototype.getBitsLength=function(){return i.getBitsLength(this.data.length)},i.prototype.write=function(e){let t;for(t=0;t<this.data.length;t++){let n=r.toSJIS(this.data[t]);if(n>=33088&&n<=40956)n-=33088;else if(n>=57408&&n<=60351)n-=49472;else throw Error(`Invalid SJIS character: `+this.data[t]+`
3
- Make sure your charset is UTF-8`);n=(n>>>8&255)*192+(n&255),e.put(n,13)}},t.exports=i})),Me=n(((e,t)=>{var n={single_source_shortest_paths:function(e,t,r){var i={},a={};a[t]=0;var o=n.PriorityQueue.make();o.push(t,0);for(var s,c,l,u,d,f,p,m,h;!o.empty();)for(l in s=o.pop(),c=s.value,u=s.cost,d=e[c]||{},d)d.hasOwnProperty(l)&&(f=d[l],p=u+f,m=a[l],h=a[l]===void 0,(h||m>p)&&(a[l]=p,o.push(l,p),i[l]=c));if(r!==void 0&&a[r]===void 0){var g=[`Could not find a path from `,t,` to `,r,`.`].join(``);throw Error(g)}return i},extract_shortest_path_from_predecessor_list:function(e,t){for(var n=[],r=t;r;)n.push(r),e[r],r=e[r];return n.reverse(),n},find_path:function(e,t,r){var i=n.single_source_shortest_paths(e,t,r);return n.extract_shortest_path_from_predecessor_list(i,r)},PriorityQueue:{make:function(e){var t=n.PriorityQueue,r={},i;for(i in e||={},t)t.hasOwnProperty(i)&&(r[i]=t[i]);return r.queue=[],r.sorter=e.sorter||t.default_sorter,r},default_sorter:function(e,t){return e.cost-t.cost},push:function(e,t){var n={value:e,cost:t};this.queue.push(n),this.queue.sort(this.sorter)},pop:function(){return this.queue.shift()},empty:function(){return this.queue.length===0}}};t!==void 0&&(t.exports=n)})),Ne=n((e=>{var t=Z(),n=Oe(),r=ke(),i=Ae(),a=je(),o=X(),s=K(),c=Me();function l(e){return unescape(encodeURIComponent(e)).length}function u(e,t,n){let r=[],i;for(;(i=e.exec(n))!==null;)r.push({data:i[0],index:i.index,mode:t,length:i[0].length});return r}function d(e){let n=u(o.NUMERIC,t.NUMERIC,e),r=u(o.ALPHANUMERIC,t.ALPHANUMERIC,e),i,a;return s.isKanjiModeEnabled()?(i=u(o.BYTE,t.BYTE,e),a=u(o.KANJI,t.KANJI,e)):(i=u(o.BYTE_KANJI,t.BYTE,e),a=[]),n.concat(r,i,a).sort(function(e,t){return e.index-t.index}).map(function(e){return{data:e.data,mode:e.mode,length:e.length}})}function f(e,o){switch(o){case t.NUMERIC:return n.getBitsLength(e);case t.ALPHANUMERIC:return r.getBitsLength(e);case t.KANJI:return a.getBitsLength(e);case t.BYTE:return i.getBitsLength(e)}}function p(e){return e.reduce(function(e,t){let n=e.length-1>=0?e[e.length-1]:null;return n&&n.mode===t.mode?(e[e.length-1].data+=t.data,e):(e.push(t),e)},[])}function m(e){let n=[];for(let r=0;r<e.length;r++){let i=e[r];switch(i.mode){case t.NUMERIC:n.push([i,{data:i.data,mode:t.ALPHANUMERIC,length:i.length},{data:i.data,mode:t.BYTE,length:i.length}]);break;case t.ALPHANUMERIC:n.push([i,{data:i.data,mode:t.BYTE,length:i.length}]);break;case t.KANJI:n.push([i,{data:i.data,mode:t.BYTE,length:l(i.data)}]);break;case t.BYTE:n.push([{data:i.data,mode:t.BYTE,length:l(i.data)}])}}return n}function h(e,n){let r={},i={start:{}},a=[`start`];for(let o=0;o<e.length;o++){let s=e[o],c=[];for(let e=0;e<s.length;e++){let l=s[e],u=``+o+e;c.push(u),r[u]={node:l,lastCount:0},i[u]={};for(let e=0;e<a.length;e++){let o=a[e];r[o]&&r[o].node.mode===l.mode?(i[o][u]=f(r[o].lastCount+l.length,l.mode)-f(r[o].lastCount,l.mode),r[o].lastCount+=l.length):(r[o]&&(r[o].lastCount=l.length),i[o][u]=f(l.length,l.mode)+4+t.getCharCountIndicator(l.mode,n))}}a=c}for(let e=0;e<a.length;e++)i[a[e]].end=0;return{map:i,table:r}}function g(e,o){let c,l=t.getBestModeForData(e);if(c=t.from(o,l),c!==t.BYTE&&c.bit<l.bit)throw Error(`"`+e+`" cannot be encoded with mode `+t.toString(c)+`.
4
- Suggested mode is: `+t.toString(l));switch(c===t.KANJI&&!s.isKanjiModeEnabled()&&(c=t.BYTE),c){case t.NUMERIC:return new n(e);case t.ALPHANUMERIC:return new r(e);case t.KANJI:return new a(e);case t.BYTE:return new i(e)}}e.fromArray=function(e){return e.reduce(function(e,t){return typeof t==`string`?e.push(g(t,null)):t.data&&e.push(g(t.data,t.mode)),e},[])},e.fromString=function(t,n){let r=h(m(d(t,s.isKanjiModeEnabled())),n),i=c.find_path(r.map,`start`,`end`),a=[];for(let e=1;e<i.length-1;e++)a.push(r.table[i[e]].node);return e.fromArray(p(a))},e.rawSplit=function(t){return e.fromArray(d(t,s.isKanjiModeEnabled()))}})),Pe=n((e=>{var t=K(),n=q(),r=ve(),i=ye(),a=be(),o=xe(),s=Se(),c=J(),l=Te(),u=Ee(),d=De(),f=Z(),p=Ne();function m(e,t){let n=e.size,r=o.getPositions(t);for(let t=0;t<r.length;t++){let i=r[t][0],a=r[t][1];for(let t=-1;t<=7;t++)if(!(i+t<=-1||n<=i+t))for(let r=-1;r<=7;r++)a+r<=-1||n<=a+r||(t>=0&&t<=6&&(r===0||r===6)||r>=0&&r<=6&&(t===0||t===6)||t>=2&&t<=4&&r>=2&&r<=4?e.set(i+t,a+r,!0,!0):e.set(i+t,a+r,!1,!0))}}function h(e){let t=e.size;for(let n=8;n<t-8;n++){let t=n%2==0;e.set(n,6,t,!0),e.set(6,n,t,!0)}}function g(e,t){let n=a.getPositions(t);for(let t=0;t<n.length;t++){let r=n[t][0],i=n[t][1];for(let t=-2;t<=2;t++)for(let n=-2;n<=2;n++)t===-2||t===2||n===-2||n===2||t===0&&n===0?e.set(r+t,i+n,!0,!0):e.set(r+t,i+n,!1,!0)}}function _(e,t){let n=e.size,r=u.getEncodedBits(t),i,a,o;for(let t=0;t<18;t++)i=Math.floor(t/3),a=t%3+n-8-3,o=(r>>t&1)==1,e.set(i,a,o,!0),e.set(a,i,o,!0)}function v(e,t,n){let r=e.size,i=d.getEncodedBits(t,n),a,o;for(a=0;a<15;a++)o=(i>>a&1)==1,a<6?e.set(a,8,o,!0):a<8?e.set(a+1,8,o,!0):e.set(r-15+a,8,o,!0),a<8?e.set(8,r-a-1,o,!0):a<9?e.set(8,15-a-1+1,o,!0):e.set(8,15-a-1,o,!0);e.set(r-8,8,1,!0)}function y(e,t){let n=e.size,r=-1,i=n-1,a=7,o=0;for(let s=n-1;s>0;s-=2)for(s===6&&s--;;){for(let n=0;n<2;n++)if(!e.isReserved(i,s-n)){let r=!1;o<t.length&&(r=(t[o]>>>a&1)==1),e.set(i,s-n,r),a--,a===-1&&(o++,a=7)}if(i+=r,i<0||n<=i){i-=r,r=-r;break}}}function b(e,n,i){let a=new r;i.forEach(function(t){a.put(t.mode.bit,4),a.put(t.getLength(),f.getCharCountIndicator(t.mode,e)),t.write(a)});let o=(t.getSymbolTotalCodewords(e)-c.getTotalCodewordsCount(e,n))*8;for(a.getLengthInBits()+4<=o&&a.put(0,4);a.getLengthInBits()%8!=0;)a.putBit(0);let s=(o-a.getLengthInBits())/8;for(let e=0;e<s;e++)a.put(e%2?17:236,8);return x(a,e,n)}function x(e,n,r){let i=t.getSymbolTotalCodewords(n),a=i-c.getTotalCodewordsCount(n,r),o=c.getBlocksCount(n,r),s=o-i%o,u=Math.floor(i/o),d=Math.floor(a/o),f=d+1,p=u-d,m=new l(p),h=0,g=Array(o),_=Array(o),v=0,y=new Uint8Array(e.buffer);for(let e=0;e<o;e++){let t=e<s?d:f;g[e]=y.slice(h,h+t),_[e]=m.encode(g[e]),h+=t,v=Math.max(v,t)}let b=new Uint8Array(i),x=0,S,C;for(S=0;S<v;S++)for(C=0;C<o;C++)S<g[C].length&&(b[x++]=g[C][S]);for(S=0;S<p;S++)for(C=0;C<o;C++)b[x++]=_[C][S];return b}function S(e,n,r,a){let o;if(Array.isArray(e))o=p.fromArray(e);else if(typeof e==`string`){let t=n;if(!t){let n=p.rawSplit(e);t=u.getBestVersionForData(n,r)}o=p.fromString(e,t||40)}else throw Error(`Invalid data`);let c=u.getBestVersionForData(o,r);if(!c)throw Error(`The amount of data is too big to be stored in a QR Code`);if(!n)n=c;else if(n<c)throw Error(`
5
- The chosen QR Code version cannot contain this amount of data.
6
- Minimum version required to store current data is: `+c+`.
7
- `);let l=b(n,r,o),d=new i(t.getSymbolSize(n));return m(d,n),h(d),g(d,n),v(d,r,0),n>=7&&_(d,n),y(d,l),isNaN(a)&&(a=s.getBestMask(d,v.bind(null,d,r))),s.applyMask(a,d),v(d,r,a),{modules:d,version:n,errorCorrectionLevel:r,maskPattern:a,segments:o}}e.create=function(e,r){if(e===void 0||e===``)throw Error(`No input text`);let i=n.M,a,o;return r!==void 0&&(i=n.from(r.errorCorrectionLevel,n.M),a=u.from(r.version),o=s.from(r.maskPattern),r.toSJISFunc&&t.setToSJISFunction(r.toSJISFunc)),S(e,a,i,o)}})),Q=n((e=>{function t(e){if(typeof e==`number`&&(e=e.toString()),typeof e!=`string`)throw Error(`Color should be defined as hex string`);let t=e.slice().replace(`#`,``).split(``);if(t.length<3||t.length===5||t.length>8)throw Error(`Invalid hex color: `+e);(t.length===3||t.length===4)&&(t=Array.prototype.concat.apply([],t.map(function(e){return[e,e]}))),t.length===6&&t.push(`F`,`F`);let n=parseInt(t.join(``),16);return{r:n>>24&255,g:n>>16&255,b:n>>8&255,a:n&255,hex:`#`+t.slice(0,6).join(``)}}e.getOptions=function(e){e||={},e.color||={};let n=e.margin===void 0||e.margin===null||e.margin<0?4:e.margin,r=e.width&&e.width>=21?e.width:void 0,i=e.scale||4;return{width:r,scale:r?4:i,margin:n,color:{dark:t(e.color.dark||`#000000ff`),light:t(e.color.light||`#ffffffff`)},type:e.type,rendererOpts:e.rendererOpts||{}}},e.getScale=function(e,t){return t.width&&t.width>=e+t.margin*2?t.width/(e+t.margin*2):t.scale},e.getImageWidth=function(t,n){let r=e.getScale(t,n);return Math.floor((t+n.margin*2)*r)},e.qrToImageData=function(t,n,r){let i=n.modules.size,a=n.modules.data,o=e.getScale(i,r),s=Math.floor((i+r.margin*2)*o),c=r.margin*o,l=[r.color.light,r.color.dark];for(let e=0;e<s;e++)for(let n=0;n<s;n++){let u=(e*s+n)*4,d=r.color.light;if(e>=c&&n>=c&&e<s-c&&n<s-c){let t=Math.floor((e-c)/o),r=Math.floor((n-c)/o);d=l[a[t*i+r]?1:0]}t[u++]=d.r,t[u++]=d.g,t[u++]=d.b,t[u]=d.a}}})),Fe=n((e=>{var t=Q();function n(e,t,n){e.clearRect(0,0,t.width,t.height),t.style||={},t.height=n,t.width=n,t.style.height=n+`px`,t.style.width=n+`px`}function r(){try{return document.createElement(`canvas`)}catch{throw Error(`You need to specify a canvas element`)}}e.render=function(e,i,a){let o=a,s=i;o===void 0&&(!i||!i.getContext)&&(o=i,i=void 0),i||(s=r()),o=t.getOptions(o);let c=t.getImageWidth(e.modules.size,o),l=s.getContext(`2d`),u=l.createImageData(c,c);return t.qrToImageData(u.data,e,o),n(l,s,c),l.putImageData(u,0,0),s},e.renderToDataURL=function(t,n,r){let i=r;i===void 0&&(!n||!n.getContext)&&(i=n,n=void 0),i||={};let a=e.render(t,n,i),o=i.type||`image/png`,s=i.rendererOpts||{};return a.toDataURL(o,s.quality)}})),Ie=n((e=>{var t=Q();function n(e,t){let n=e.a/255,r=t+`="`+e.hex+`"`;return n<1?r+` `+t+`-opacity="`+n.toFixed(2).slice(1)+`"`:r}function r(e,t,n){let r=e+t;return n!==void 0&&(r+=` `+n),r}function i(e,t,n){let i=``,a=0,o=!1,s=0;for(let c=0;c<e.length;c++){let l=Math.floor(c%t),u=Math.floor(c/t);!l&&!o&&(o=!0),e[c]?(s++,c>0&&l>0&&e[c-1]||(i+=o?r(`M`,l+n,.5+u+n):r(`m`,a,0),a=0,o=!1),l+1<t&&e[c+1]||(i+=r(`h`,s),s=0)):a++}return i}e.render=function(e,r,a){let o=t.getOptions(r),s=e.modules.size,c=e.modules.data,l=s+o.margin*2,u=o.color.light.a?`<path `+n(o.color.light,`fill`)+` d="M0 0h`+l+`v`+l+`H0z"/>`:``,d=`<path `+n(o.color.dark,`stroke`)+` d="`+i(c,s,o.margin)+`"/>`,f=`viewBox="0 0 `+l+` `+l+`"`,p=`<svg xmlns="http://www.w3.org/2000/svg" `+(o.width?`width="`+o.width+`" height="`+o.width+`" `:``)+f+` shape-rendering="crispEdges">`+u+d+`</svg>
8
- `;return typeof a==`function`&&a(null,p),p}})),Le=n((e=>{var t=_e(),n=Pe(),r=Fe(),i=Ie();function a(e,r,i,a,o){let s=[].slice.call(arguments,1),c=s.length,l=typeof s[c-1]==`function`;if(!l&&!t())throw Error(`Callback required as last argument`);if(l){if(c<2)throw Error(`Too few arguments provided`);c===2?(o=i,i=r,r=a=void 0):c===3&&(r.getContext&&o===void 0?(o=a,a=void 0):(o=a,a=i,i=r,r=void 0))}else{if(c<1)throw Error(`Too few arguments provided`);return c===1?(i=r,r=a=void 0):c===2&&!r.getContext&&(a=i,i=r,r=void 0),new Promise(function(t,o){try{t(e(n.create(i,a),r,a))}catch(e){o(e)}})}try{let t=n.create(i,a);o(null,e(t,r,a))}catch(e){o(e)}}e.create=n.create,e.toCanvas=a.bind(null,r.render),e.toDataURL=a.bind(null,r.renderToDataURL),e.toString=a.bind(null,function(e,t,n){return i.render(e,n)})}))();async function Re(e,t={}){let n=await u.post(`/api/config/channels/${e}/auth/start`,t);if(!n.ok)throw Error(n.error.message);return n.data}async function ze(e,t){let n=await u.post(`/api/config/channels/${e}/auth/poll`,t);if(!n.ok)throw Error(n.error.message);return n.data}function Be(){return f({mutationFn:({channel:e,data:t})=>Re(e,t)})}function Ve(){return f({mutationFn:({channel:e,data:t})=>ze(e,t)})}function He(e){let t=e.accounts,n=new Set;if(typeof e.defaultAccountId==`string`&&e.defaultAccountId.trim()&&n.add(e.defaultAccountId.trim()),t&&typeof t==`object`&&!Array.isArray(t))for(let e of Object.keys(t)){let t=e.trim();t&&n.add(t)}return[...n]}function Ue(e,t){if(typeof e.baseUrl==`string`&&e.baseUrl.trim())return e.baseUrl.trim();if(typeof t.baseUrl==`string`&&t.baseUrl.trim())return t.baseUrl.trim()}function We({channelConfig:e,formData:t,disabled:n=!1}){let i=d(),a=Be(),u=Ve(),[f,p]=(0,z.useState)(null),[m,h]=(0,z.useState)(null),[g,_]=(0,z.useState)(null),v=(0,z.useMemo)(()=>He(e),[e]),y=v[0],b=Ue(t,e),S=v.length>0;(0,z.useEffect)(()=>{S&&(p(null),h(e=>e?.status===`authorized`?e:{channel:`weixin`,status:`authorized`,message:r(`weixinAuthAuthorized`),accountId:y??null}))},[S,y]),(0,z.useEffect)(()=>{if(!f){_(null);return}let e=!1;return(0,Le.toDataURL)(f.qrCodeUrl,{errorCorrectionLevel:`M`,margin:1,width:480}).then(t=>{e||_(t)}).catch(()=>{e||_(null)}),()=>{e=!0}},[f]),(0,z.useEffect)(()=>{if(!f)return;let e=!1,t=null,n=async()=>{try{let a=await u.mutateAsync({channel:`weixin`,data:{sessionId:f.sessionId}});if(e)return;if(h(a),a.status===`authorized`){await i.invalidateQueries({queryKey:[`config`]}),await i.invalidateQueries({queryKey:[`config-meta`]}),c.success(a.message||r(`weixinAuthAuthorized`)),p(null);return}if(a.status===`expired`||a.status===`error`){c.error(a.message||r(`weixinAuthRetryRequired`)),p(null);return}t=setTimeout(n,a.nextPollMs??f.intervalMs)}catch(t){if(e)return;let n=t instanceof Error?t.message:String(t);c.error(`${r(`error`)}: ${n}`),p(null)}};return t=setTimeout(n,f.intervalMs),()=>{e=!0,t&&clearTimeout(t)}},[f,u,i]);let C=async()=>{try{let e=await a.mutateAsync({channel:`weixin`,data:{baseUrl:b,accountId:typeof t.defaultAccountId==`string`&&t.defaultAccountId.trim()?t.defaultAccountId.trim():void 0}});p(e),h({channel:`weixin`,status:`pending`,message:e.note,nextPollMs:e.intervalMs})}catch(e){let t=e instanceof Error?e.message:String(e);c.error(`${r(`error`)}: ${t}`)}},w=f?m?.status===`scanned`?r(`weixinAuthScanned`):r(`weixinAuthWaiting`):r(S?`weixinAuthAuthorized`:`weixinAuthNotConnected`),E=a.isPending?r(`weixinAuthStarting`):r(f?`weixinAuthWaiting`:S?`weixinAuthReconnect`:`weixinAuthConnect`);return(0,V.jsx)(`section`,{className:`rounded-2xl border border-primary/20 bg-gradient-to-br from-primary-50/70 via-white to-emerald-50/60 p-5`,children:(0,V.jsxs)(`div`,{className:`flex flex-col gap-4 lg:flex-row lg:items-start lg:justify-between`,children:[(0,V.jsxs)(`div`,{className:`space-y-3`,children:[(0,V.jsxs)(`div`,{className:`inline-flex items-center gap-2 rounded-full bg-white/90 px-3 py-1 text-xs font-medium text-primary shadow-sm`,children:[(0,V.jsx)(fe,{className:`h-3.5 w-3.5`}),r(`weixinAuthTitle`)]}),(0,V.jsxs)(`div`,{children:[(0,V.jsx)(`h4`,{className:`text-base font-semibold text-gray-900`,children:r(`weixinAuthDescription`)}),(0,V.jsx)(`p`,{className:`mt-1 text-sm text-gray-600`,children:r(`weixinAuthHint`)})]}),(0,V.jsxs)(`div`,{className:s(`inline-flex w-fit items-center gap-2 rounded-full px-3 py-1 text-xs font-medium`,f?`bg-amber-50 text-amber-700`:S?`bg-emerald-50 text-emerald-700`:`bg-gray-100 text-gray-600`),children:[f?(0,V.jsx)(T,{className:`h-3.5 w-3.5 animate-spin`}):(0,V.jsx)(de,{className:`h-3.5 w-3.5`}),w]}),(0,V.jsxs)(`div`,{className:`space-y-1 text-sm text-gray-600`,children:[(0,V.jsx)(`p`,{children:r(`weixinAuthCapabilityHint`)}),y?(0,V.jsxs)(`p`,{children:[r(`weixinAuthPrimaryAccount`),`: `,(0,V.jsx)(`span`,{className:`font-mono text-xs text-gray-900`,children:y})]}):null,v.length>1?(0,V.jsxs)(`p`,{children:[r(`weixinAuthConnectedAccounts`),`: `,(0,V.jsx)(`span`,{className:`font-mono text-xs text-gray-900`,children:v.join(`, `)})]}):null,b?(0,V.jsxs)(`p`,{children:[r(`weixinAuthBaseUrl`),`: `,(0,V.jsx)(`span`,{className:`font-mono text-xs text-gray-900`,children:b})]}):null]}),(0,V.jsx)(l,{type:`button`,onClick:C,disabled:n||a.isPending||!!f,className:`rounded-xl`,children:E})]}),(0,V.jsx)(`div`,{className:`w-full max-w-sm rounded-2xl border border-dashed border-primary/25 bg-white/85 p-4 shadow-sm`,children:f?(0,V.jsxs)(`div`,{className:`space-y-3`,children:[(0,V.jsx)(`div`,{className:`overflow-hidden rounded-2xl border border-gray-100 bg-white p-3`,children:g?(0,V.jsx)(`img`,{src:g,alt:r(`weixinAuthQrAlt`),className:`mx-auto aspect-square w-full max-w-[240px] object-contain`}):(0,V.jsx)(`div`,{className:`flex aspect-square w-full items-center justify-center rounded-xl bg-gray-50 text-gray-500`,children:(0,V.jsxs)(`div`,{className:`flex flex-col items-center gap-2 text-center`,children:[(0,V.jsx)(T,{className:`h-5 w-5 animate-spin`}),(0,V.jsx)(`p`,{className:`text-xs`,children:r(`weixinAuthStarting`)})]})})}),(0,V.jsxs)(`div`,{className:`space-y-1 text-xs text-gray-500`,children:[(0,V.jsx)(`p`,{children:m?.message||f.note||r(`weixinAuthScanPrompt`)}),(0,V.jsxs)(`p`,{children:[r(`weixinAuthExpiresAt`),`: `,o(f.expiresAt)]})]}),(0,V.jsxs)(`a`,{href:f.qrCodeUrl,target:`_blank`,rel:`noreferrer`,className:`inline-flex items-center gap-1.5 text-xs text-primary transition-colors hover:text-primary-hover`,children:[(0,V.jsx)(x,{className:`h-3.5 w-3.5`}),r(`weixinAuthOpenQr`)]})]}):(0,V.jsxs)(`div`,{className:`flex min-h-[280px] flex-col items-center justify-center rounded-2xl bg-gray-50/80 px-6 text-center`,children:[(0,V.jsx)(fe,{className:`h-9 w-9 text-gray-300`}),(0,V.jsx)(`p`,{className:`mt-3 text-sm font-medium text-gray-700`,children:r(`weixinAuthReadyTitle`)}),(0,V.jsx)(`p`,{className:`mt-1 text-xs leading-5 text-gray-500`,children:r(`weixinAuthReadyDescription`)})]})})]})})}function $(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Ge(e,t){let n={...e};for(let[e,r]of Object.entries(t)){let t=n[e];if($(t)&&$(r)){n[e]=Ge(t,r);continue}n[e]=r}return n}function Ke(e,t){let n=e.split(`.`),r={},i=r;for(let e=0;e<n.length-1;e+=1){let t=n[e];i[t]={},i=i[t]}return i[n[n.length-1]]=t,r}function qe({channelName:e}){let{data:t}=k(),{data:n}=j(),{data:i}=N(),a=ee(),o=te(),[u,d]=(0,z.useState)({}),[f,m]=(0,z.useState)({}),[h,g]=(0,z.useState)(null),_=e?t?.channels[e]:null,v=e?G()[e]??[]:[],y=i?.uiHints,x=e?`channels.${e}`:null,S=i?.actions?.filter(e=>e.scope===x)??[],w=e&&(R(`channels.${e}`,y)?.label??e),T=n?.channels.find(t=>t.name===e),E=T?B(T):void 0,D=e===`weixin`;(0,z.useEffect)(()=>{if(_){d({..._});let t={};(e?G()[e]??[]:[]).filter(e=>e.type===`json`).forEach(e=>{let n=_[e.name];t[e.name]=JSON.stringify(n??{},null,2)}),m(t)}else d({}),m({})},[_,e]);let O=(e,t)=>{d(n=>({...n,[e]:t}))},A=t=>{if(t.preventDefault(),!e)return;let n={...u};for(let e of v){if(e.type!==`password`)continue;let t=n[e.name];(typeof t!=`string`||t.length===0)&&delete n[e.name]}for(let e of v){if(e.type!==`json`)continue;let t=f[e.name]??``;try{n[e.name]=t.trim()?JSON.parse(t):{}}catch{c.error(`${r(`invalidJson`)}: ${e.name}`);return}}a.mutate({channel:e,data:n})},M=t=>{if(!t||!e)return;let n=t.channels;if(!$(n))return;let r=n[e];$(r)&&d(e=>Ge(e,r))},P=async t=>{if(!(!e||!x)){g(t.id);try{let n={...u};t.saveBeforeRun&&(n={...n,...t.savePatch??{}},d(n),await a.mutateAsync({channel:e,data:n}));let i=await o.mutateAsync({actionId:t.id,data:{scope:x,draftConfig:Ke(x,n)}});M(i.patch),i.ok?c.success(i.message||r(`success`)):c.error(i.message||r(`error`))}catch(e){let t=e instanceof Error?e.message:String(e);c.error(`${r(`error`)}: ${t}`)}finally{g(null)}}};if(!e||!T||!_)return(0,V.jsx)(`div`,{className:ae,children:(0,V.jsxs)(`div`,{children:[(0,V.jsx)(`h3`,{className:`text-base font-semibold text-gray-900`,children:r(`channelsSelectTitle`)}),(0,V.jsx)(`p`,{className:`mt-2 text-sm text-gray-500`,children:r(`channelsSelectDescription`)})]})});let I=!!_.enabled;return(0,V.jsxs)(`div`,{className:se,children:[(0,V.jsx)(`div`,{className:`border-b border-gray-100 px-6 py-5`,children:(0,V.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-3`,children:[(0,V.jsxs)(`div`,{className:`min-w-0`,children:[(0,V.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,V.jsx)(F,{name:e,src:C(e),className:s(`h-9 w-9 rounded-lg border`,I?`border-primary/30 bg-white`:`border-gray-200/70 bg-white`),imgClassName:`h-5 w-5 object-contain`,fallback:(0,V.jsx)(`span`,{className:`text-sm font-semibold uppercase text-gray-500`,children:e[0]})}),(0,V.jsx)(`h3`,{className:`truncate text-lg font-semibold text-gray-900 capitalize`,children:w})]}),(0,V.jsx)(`p`,{className:`mt-2 text-sm text-gray-500`,children:r(`channelsFormDescription`)}),E&&(0,V.jsxs)(`a`,{href:E,className:`mt-2 inline-flex items-center gap-1.5 text-xs text-primary transition-colors hover:text-primary-hover`,children:[(0,V.jsx)(b,{className:`h-3.5 w-3.5`}),r(`channelsGuideTitle`)]})]}),(0,V.jsx)(L,{status:I?`active`:`inactive`,label:r(I?`statusActive`:`statusInactive`)})]})}),(0,V.jsxs)(`form`,{onSubmit:A,className:`flex min-h-0 flex-1 flex-col`,children:[(0,V.jsx)(`div`,{className:`min-h-0 flex-1 space-y-6 overflow-y-auto overscroll-contain px-6 py-5`,children:D?(0,V.jsxs)(V.Fragment,{children:[(0,V.jsx)(We,{channelConfig:_,formData:u,disabled:a.isPending||!!h}),(0,V.jsxs)(`details`,{className:`group rounded-2xl border border-gray-200/80 bg-white`,children:[(0,V.jsxs)(`summary`,{className:`flex cursor-pointer list-none items-center justify-between gap-3 px-5 py-4 text-sm font-medium text-gray-900`,children:[(0,V.jsxs)(`div`,{children:[(0,V.jsx)(`p`,{children:r(`weixinAuthAdvancedTitle`)}),(0,V.jsx)(`p`,{className:`mt-1 text-xs font-normal text-gray-500`,children:r(`weixinAuthAdvancedDescription`)})]}),(0,V.jsx)(p,{className:`h-4 w-4 text-gray-400 transition-transform group-open:rotate-180`})]}),(0,V.jsx)(`div`,{className:`space-y-6 border-t border-gray-100 px-5 py-5`,children:(0,V.jsx)(H,{channelName:e,fields:v,formData:u,jsonDrafts:f,setJsonDrafts:m,updateField:O,uiHints:y})})]})]}):(0,V.jsx)(H,{channelName:e,fields:v,formData:u,jsonDrafts:f,setJsonDrafts:m,updateField:O,uiHints:y})}),(0,V.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-3 border-t border-gray-100 px-6 py-4`,children:[(0,V.jsx)(`div`,{className:`flex flex-wrap items-center gap-2`,children:S.filter(e=>e.trigger===`manual`).map(e=>(0,V.jsx)(l,{type:`button`,onClick:()=>P(e),disabled:a.isPending||!!h,variant:`secondary`,children:h===e.id?r(`connecting`):e.title},e.id))}),(0,V.jsx)(l,{type:`submit`,disabled:a.isPending||!!h,children:a.isPending?r(`saving`):r(`save`)})]})]})]})}var Je={telegram:`channelDescTelegram`,slack:`channelDescSlack`,email:`channelDescEmail`,webhook:`channelDescWebhook`,discord:`channelDescDiscord`,feishu:`channelDescFeishu`,weixin:`channelDescWeixin`};function Ye(){let{data:e}=k(),{data:t}=j(),{data:n}=N(),[i,a]=(0,z.useState)(`enabled`),[o,c]=(0,z.useState)(),[l,u]=(0,z.useState)(``),d=n?.uiHints,f=t?.channels,p=e?.channels,m=[{id:`enabled`,label:r(`channelsTabEnabled`),count:(f??[]).filter(e=>p?.[e.name]?.enabled).length},{id:`all`,label:r(`channelsTabAll`),count:(f??[]).length}],h=(0,z.useMemo)(()=>{let e=l.trim().toLowerCase();return(f??[]).filter(e=>{let t=p?.[e.name]?.enabled||!1;return i===`enabled`?t:!0}).filter(t=>e?(t.displayName||t.name).toLowerCase().includes(e)||t.name.toLowerCase().includes(e):!0)},[i,p,f,l]);return(0,z.useEffect)(()=>{if(h.length===0){c(void 0);return}h.some(e=>e.name===o)||c(h[0].name)},[h,o]),!e||!t?(0,V.jsx)(`div`,{className:`p-8 text-gray-400`,children:r(`channelsLoading`)}):(0,V.jsxs)(I,{className:`xl:flex xl:h-full xl:min-h-0 xl:flex-col xl:pb-0`,children:[(0,V.jsx)(ne,{title:r(`channelsPageTitle`),description:r(`channelsPageDescription`)}),(0,V.jsxs)(`div`,{className:s(ie,`xl:min-h-0 xl:flex-1`),children:[(0,V.jsxs)(`section`,{className:oe,children:[(0,V.jsx)(`div`,{className:`border-b border-gray-100 px-4 pt-4`,children:(0,V.jsx)(re,{tabs:m,activeTab:i,onChange:a,className:`mb-0`})}),(0,V.jsx)(`div`,{className:`border-b border-gray-100 px-4 py-3`,children:(0,V.jsxs)(`div`,{className:`relative`,children:[(0,V.jsx)(E,{className:`pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-gray-400`}),(0,V.jsx)(O,{value:l,onChange:e=>u(e.target.value),placeholder:r(`channelsFilterPlaceholder`),className:`h-10 rounded-xl pl-9`})]})}),(0,V.jsxs)(`div`,{className:`min-h-0 flex-1 space-y-2 overflow-y-auto overscroll-contain p-3`,children:[h.map(t=>{let n=e.channels[t.name]?.enabled||!1,i=R(`channels.${t.name}`,d),a=B(t),l=i?.help||r(Je[t.name]||`channelDescriptionDefault`);return(0,V.jsx)(`button`,{type:`button`,onClick:()=>c(t.name),className:s(`w-full rounded-xl border p-2.5 text-left transition-all`,o===t.name?`border-primary/30 bg-primary-50/40 shadow-sm`:`border-gray-200/70 bg-white hover:border-gray-300 hover:bg-gray-50/70`),children:(0,V.jsxs)(`div`,{className:`flex items-start justify-between gap-3`,children:[(0,V.jsxs)(`div`,{className:`flex min-w-0 items-center gap-3`,children:[(0,V.jsx)(F,{name:t.name,src:C(t.name),className:s(`h-10 w-10 rounded-lg border`,n?`border-primary/30 bg-white`:`border-gray-200/70 bg-white`),imgClassName:`h-5 w-5 object-contain`,fallback:(0,V.jsx)(`span`,{className:`text-sm font-semibold uppercase text-gray-500`,children:t.name[0]})}),(0,V.jsxs)(`div`,{className:`min-w-0`,children:[(0,V.jsx)(`p`,{className:`truncate text-sm font-semibold text-gray-900`,children:t.displayName||t.name}),(0,V.jsx)(`p`,{className:`line-clamp-1 text-[11px] text-gray-500`,children:l})]})]}),(0,V.jsxs)(`div`,{className:`flex items-center gap-2`,children:[a&&(0,V.jsx)(`a`,{href:a,onClick:e=>e.stopPropagation(),className:`inline-flex h-7 w-7 items-center justify-center rounded-md text-gray-300 transition-colors hover:bg-gray-100/70 hover:text-gray-500`,title:r(`channelsGuideTitle`),children:(0,V.jsx)(x,{className:`h-3.5 w-3.5`})}),(0,V.jsx)(L,{status:n?`active`:`inactive`,label:r(n?`statusActive`:`statusInactive`),className:`min-w-[56px] justify-center`})]})]})},t.name)}),h.length===0&&(0,V.jsxs)(`div`,{className:`flex h-full min-h-[220px] flex-col items-center justify-center rounded-xl border border-dashed border-gray-200 bg-gray-50/70 py-10 text-center`,children:[(0,V.jsx)(`div`,{className:`mb-3 flex h-10 w-10 items-center justify-center rounded-lg bg-white`,children:(0,V.jsx)(P,{className:`h-5 w-5 text-gray-300`})}),(0,V.jsx)(`p`,{className:`text-sm font-medium text-gray-700`,children:r(`channelsNoMatch`)})]})]})]}),(0,V.jsx)(qe,{channelName:o})]})]})}export{Ye as ChannelsList};
@@ -1 +0,0 @@
1
- import{t as e}from"./DocBrowser-C_C7daBv.js";export{e as DocBrowser};
@@ -1 +0,0 @@
1
- import{t as e}from"./MarketplacePage-DaSRsFUA.js";export{e as MarketplacePage};