@tbox.cn/app-module-member 0.2.0 → 0.8.6

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 (65) hide show
  1. package/AGENTS.md +16 -0
  2. package/README.md +99 -11
  3. package/dist/chunk-KEBILLQ5.js +771 -0
  4. package/dist/chunk-T4SYPQA5.js +1565 -0
  5. package/dist/client/index.d.ts +2 -2
  6. package/dist/client/index.js +1 -1
  7. package/dist/index.d.ts +2 -3
  8. package/dist/index.js +12 -2
  9. package/dist/login-mascot-5D4X6YZ7.jpg +0 -0
  10. package/dist/member-QFCIYILN.css +1734 -0
  11. package/dist/server/index.d.ts +617 -246
  12. package/dist/server/index.js +11 -1
  13. package/package.json +25 -16
  14. package/skills/member/SKILL.md +141 -0
  15. package/skills/member/references/enrollment.md +34 -0
  16. package/skills/member/references/points-and-card.md +24 -0
  17. package/src/client/assets/login-mascot.jpg +0 -0
  18. package/src/client/assets.d.ts +5 -0
  19. package/src/client/cards/index.ts +10 -0
  20. package/src/client/cards/member-card-summary/index.tsx +375 -0
  21. package/src/client/cards/member-enrollment-cta/index.tsx +61 -0
  22. package/src/client/cards/member-enrollment-form/index.tsx +181 -0
  23. package/src/client/cards/member-enrollment-status/index.tsx +65 -0
  24. package/src/client/cards/member-info/index.tsx +60 -0
  25. package/src/client/cards/member-login-cta/index.tsx +81 -0
  26. package/src/client/cards/member-point-usage-list/index.tsx +53 -0
  27. package/src/client/cards/view.ts +39 -0
  28. package/src/client/components/ImageWithFallback.tsx +38 -0
  29. package/src/client/index.ts +6 -4
  30. package/src/client/styles/member.css +1734 -0
  31. package/src/client/types/css.d.ts +2 -0
  32. package/src/server/action.ts +348 -0
  33. package/src/server/cards/index.ts +7 -7
  34. package/src/server/cards/member-card-summary/meta.ts +26 -5
  35. package/src/server/cards/member-card-summary/samples.ts +272 -0
  36. package/src/server/cards/member-enrollment-cta/meta.ts +19 -0
  37. package/src/server/cards/member-enrollment-form/meta.ts +10 -6
  38. package/src/server/cards/member-enrollment-status/meta.ts +5 -6
  39. package/src/server/cards/member-info/meta.ts +1 -1
  40. package/src/server/cards/member-login-cta/meta.ts +16 -0
  41. package/src/server/cards/member-point-usage-list/meta.ts +2 -3
  42. package/src/server/handler.ts +159 -119
  43. package/src/server/index.ts +109 -50
  44. package/src/server/ports.ts +66 -0
  45. package/src/server/service.ts +94 -80
  46. package/src/server/status.ts +87 -0
  47. package/src/server/subject-binding.ts +19 -0
  48. package/src/server/tool.ts +469 -99
  49. package/tbox.module.json +124 -0
  50. package/tests/cards-render.test.tsx +526 -0
  51. package/tests/enrollment.test.ts +121 -0
  52. package/tests/ports-resolve.test.ts +95 -0
  53. package/tests/preference-memory.test.ts +86 -0
  54. package/tests/samples.test.ts +61 -0
  55. package/tests/service.test.ts +593 -35
  56. package/tests/skills.test.ts +65 -0
  57. package/tests/status.test.ts +127 -0
  58. package/tests/view.test.ts +33 -0
  59. package/tsup.config.ts +9 -1
  60. package/dist/chunk-JGZGLFO6.js +0 -111
  61. package/dist/chunk-ZV6B36AO.js +0 -613
  62. package/src/client/cards/index.tsx +0 -135
  63. package/src/server/cards/member-coupon-detail/meta.ts +0 -19
  64. package/src/server/cards/member-coupon-list/meta.ts +0 -18
  65. package/tbox.component.json +0 -28
@@ -1,135 +0,0 @@
1
- /**
2
- * module-member 客户端卡片渲染(011 K2:7 卡)。
3
- * 只消费 SDK 基元(CardFrame/ValueText/StatusPill)+ `--tbox-*` tokens。
4
- */
5
- import React from 'react';
6
- import { CardFrame, ValueText, StatusPill } from '@tbox.cn/app-sdk/client';
7
- import type {
8
- MemberInfoCardData,
9
- MemberCardSummaryCardData,
10
- MemberCouponListCardData,
11
- MemberCouponDetailCardData,
12
- MemberPointUsageListCardData,
13
- MemberEnrollmentFormCardData,
14
- MemberEnrollmentStatusCardData,
15
- } from '@tbox.cn/app-contracts-mall';
16
-
17
- const itemStyle: React.CSSProperties = {
18
- padding: '8px 0',
19
- borderBottom: '1px solid var(--tbox-divider, #f0f0f0)',
20
- };
21
-
22
- export function MemberInfoCard(props: { data: MemberInfoCardData }) {
23
- const { data } = props;
24
- return (
25
- <CardFrame title="会员信息">
26
- <StatusPill tone={data.state === 'active' ? 'success' : 'neutral'} text={data.state === 'active' ? '已入会' : '未入会'} />
27
- {data.displayName && <ValueText label="昵称" value={data.displayName} />}
28
- {data.contactDisplay && <ValueText label="联系方式" value={data.contactDisplay} />}
29
- {data.memberRef && <ValueText label="会员编号" value={data.memberRef} />}
30
- {data.labels.length > 0 && <ValueText label="标签" value={data.labels.map((l) => l.name).join(' / ')} />}
31
- </CardFrame>
32
- );
33
- }
34
-
35
- export function MemberCardSummaryCard(props: { data: MemberCardSummaryCardData }) {
36
- const { data } = props;
37
- return (
38
- <CardFrame title={data.cardDisplay}>
39
- <StatusPill tone={data.status === 'active' ? 'success' : 'warning'} text={data.status === 'active' ? '正常' : data.status} />
40
- {data.levelName && <ValueText label="等级" value={data.levelName} />}
41
- <ValueText label="可用积分" value={String(data.availablePoints)} />
42
- </CardFrame>
43
- );
44
- }
45
-
46
- export function MemberCouponListCard(props: { data: MemberCouponListCardData }) {
47
- const { data } = props;
48
- if (data.items.length === 0) return <CardFrame title="优惠券">暂无优惠券</CardFrame>;
49
- return (
50
- <CardFrame title="优惠券" subtitle={`共 ${data.total} 张`}>
51
- {data.items.map((c) => (
52
- <div key={c.couponRef} style={itemStyle}>
53
- <div style={{ display: 'flex', justifyContent: 'space-between', gap: 8 }}>
54
- <span style={{ fontSize: 14, fontWeight: 600 }}>{c.title}</span>
55
- <StatusPill
56
- tone={c.status === 'effective' ? 'success' : 'neutral'}
57
- text={c.status === 'effective' ? '可使用' : c.status}
58
- />
59
- </div>
60
- {c.benefitText && <div style={{ fontSize: 12, color: 'var(--tbox-primary, #e93b3d)' }}>{c.benefitText}</div>}
61
- {c.thresholdText && <div style={{ fontSize: 12, color: 'var(--tbox-text-secondary, #888)' }}>{c.thresholdText}</div>}
62
- </div>
63
- ))}
64
- </CardFrame>
65
- );
66
- }
67
-
68
- export function MemberCouponDetailCard(props: { data: MemberCouponDetailCardData }) {
69
- const { data } = props;
70
- return (
71
- <CardFrame title={data.title}>
72
- <StatusPill tone={data.status === 'effective' ? 'success' : 'neutral'} text={data.status} />
73
- {data.benefitText && <ValueText label="优惠" value={data.benefitText} />}
74
- {data.thresholdText && <ValueText label="门槛" value={data.thresholdText} />}
75
- {data.description && <div style={{ fontSize: 13, marginTop: 4 }}>{data.description}</div>}
76
- </CardFrame>
77
- );
78
- }
79
-
80
- export function MemberPointUsageListCard(props: { data: MemberPointUsageListCardData }) {
81
- const { data } = props;
82
- return (
83
- <CardFrame title="积分余额与流水" subtitle={`等级 ${data.level}`}>
84
- <ValueText label="当前积分" value={String(data.balance)} />
85
- {data.items.length > 0 && (
86
- <div style={{ marginTop: 8 }}>
87
- {data.items.map((u) => (
88
- <div key={u.usageRecordRef} style={{ display: 'flex', justifyContent: 'space-between', padding: '4px 0' }}>
89
- <span style={{ fontSize: 13 }}>{u.title}</span>
90
- <span
91
- style={{
92
- fontSize: 13,
93
- color: u.amount.startsWith('-') ? 'var(--tbox-primary, #e93b3d)' : 'var(--tbox-success, #0f8a5f)',
94
- }}
95
- >
96
- {u.amount}
97
- </span>
98
- </div>
99
- ))}
100
- </div>
101
- )}
102
- </CardFrame>
103
- );
104
- }
105
-
106
- export function MemberEnrollmentFormCard(props: { data: MemberEnrollmentFormCardData }) {
107
- const { data } = props;
108
- if (data.state === 'active') {
109
- return (
110
- <CardFrame title="入会">
111
- <StatusPill tone="success" text="已入会" />
112
- </CardFrame>
113
- );
114
- }
115
- return (
116
- <CardFrame title="会员入会" subtitle="填写信息成为会员">
117
- {/* 011 评审 M1:表单输入为二期;当前最小闭环 = 按钮以会话身份入会(字段仅展示) */}
118
- <div style={{ fontSize: 13, color: 'var(--tbox-text-secondary, #888)', marginBottom: 8 }}>
119
- 入会需要{data.fields.filter((f) => f.required).map((f) => f.label).join('、')}
120
- ,当前以会话身份一键入会(表单填写二期开放)。
121
- </div>
122
- </CardFrame>
123
- );
124
- }
125
-
126
- export function MemberEnrollmentStatusCard(props: { data: MemberEnrollmentStatusCardData }) {
127
- const { data } = props;
128
- return (
129
- <CardFrame title="入会结果">
130
- <StatusPill tone={data.success ? 'success' : 'warning'} text={data.success ? '入会成功' : '入会失败'} />
131
- {data.memberRef && <ValueText label="会员编号" value={data.memberRef} />}
132
- {data.message && <div style={{ fontSize: 13, marginTop: 4 }}>{data.message}</div>}
133
- </CardFrame>
134
- );
135
- }
@@ -1,19 +0,0 @@
1
- import type { CardMeta } from '@tbox.cn/app-contracts';
2
- import { memberCouponDetailCardDataSchema } from '@tbox.cn/app-contracts-mall';
3
-
4
- const meta: CardMeta<typeof memberCouponDetailCardDataSchema> = {
5
- cardType: 'member-coupon-detail',
6
- dataSchema: memberCouponDetailCardDataSchema,
7
- allowedTools: [],
8
- displayName: '优惠券详情',
9
- description: '单张优惠券详情(点击列表项查看)',
10
- sampleData: {
11
- couponRef: 'c1',
12
- title: '满 100 减 10',
13
- type: 'amount',
14
- status: 'effective',
15
- },
16
- schemaVersion: 1,
17
- };
18
-
19
- export default meta;
@@ -1,18 +0,0 @@
1
- import type { CardMeta } from '@tbox.cn/app-contracts';
2
- import { memberCouponListCardDataSchema } from '@tbox.cn/app-contracts-mall';
3
-
4
- const meta: CardMeta<typeof memberCouponListCardDataSchema> = {
5
- cardType: 'member-coupon-list',
6
- dataSchema: memberCouponListCardDataSchema,
7
- allowedTools: ['queryMemberCoupons'],
8
- displayName: '优惠券列表',
9
- description: '会员优惠券(状态/面额/门槛)',
10
- sampleData: {
11
- userId: 'u_1001',
12
- items: [{ couponRef: 'c1', title: '满 100 减 10', type: 'amount', status: 'effective' }],
13
- total: 1,
14
- },
15
- schemaVersion: 1,
16
- };
17
-
18
- export default meta;
@@ -1,28 +0,0 @@
1
- {
2
- "schemaVersion": 1,
3
- "name": "module-member",
4
- "version": "0.2.0",
5
- "kind": "business",
6
- "risk": { "level": "medium", "writeBoundary": "source" },
7
- "distribution": { "defaultMode": "codegen" },
8
- "contributes": {
9
- "handlers": ["member"],
10
- "tools": ["queryPoints", "queryMemberInfo", "queryMemberCard", "queryMemberCoupons", "queryEnrollmentForm"],
11
- "cards": [
12
- { "cardType": "member-info", "schemaVersion": 1 },
13
- { "cardType": "member-card-summary", "schemaVersion": 1 },
14
- { "cardType": "member-coupon-list", "schemaVersion": 1 },
15
- { "cardType": "member-coupon-detail", "schemaVersion": 1 },
16
- { "cardType": "member-point-usage-list", "schemaVersion": 1 },
17
- { "cardType": "member-enrollment-form", "schemaVersion": 1 },
18
- { "cardType": "member-enrollment-status", "schemaVersion": 1 }
19
- ],
20
- "routes": [],
21
- "pages": [],
22
- "tabs": []
23
- },
24
- "dependencies": {
25
- "modules": [{ "id": "contracts-mall", "required": true }]
26
- },
27
- "env": []
28
- }