← 返回 MegaWallet 工作文档

MEGAWALLET · WORKING DOCUMENT 05

Send 功能设计稿评审分享

原始文件 · my-history/5.Wallet-Send.md

这次分享,旨在让产品、设计同学能意识到,从原型图、设计稿到实际落地,还差的东西。


一、当第一眼看到 Send 这堆设计稿,前端同学的第一反应是什么?

我的第一反应(还没细看具体内容时候),我首先意识到是这是一个拥有动态高度的多步 Modal。

动态高度不止体现在每一步之间有差异;同一步也会存在不同的状态,对于不同的高度。


二、前端同学们觉得,这种设计会产生什么问题吗?

  1. 以第一步而言,起码会有 3 种不同的高度,会随着用户的输入跳变。

    • 显示 Tabs 列表
    • 校验通过的合法地址
    • 校验未通过的地址和未通过 Tip(根据未通过文案的高度会再衍生出 n 行的差异)
  2. 这种高度的跳变是直接作用在用户视觉中心上的,会随着 input 输入而变化,连 Next 按钮的位置都会发生巨大偏移。

  3. 接着想到:如果不把 Modal 绝对垂直居中,而是距离顶部一个固定距离,是否可以减轻一些跳变带来的 UX 影响?(打个问号?)


三、接着回想一下其他钱包怎么做的,这个问题为什么会出现在 Mega Wallet 上

  1. 其他钱包多是以插件、mobile 的小屏形态,Send 页面直接铺满整页。

  2. 我猜之所以 Send 做成 Modal,是因为这是大屏的 desktop 钱包:出个 Modal 而不是铺满屏幕,在视觉上更符合一个大屏应用的直觉。

    但是设计出这个 Modal 的时候,请问产品和设计师是不是没有考虑过会对交互造成什么影响?


四、细看 Send 内容

第一眼右上角 Account 1,然后去看了后面几步,确定只有这个地方标识了「当前账户」,并且只显示了个别名。

  1. 没见过有钱包在签发环境不显示发送账户地址、当前网络这俩个信息。
  2. 除非这个钱包是单链钱包,比如只支持 Mega 主网,测试网都不支持的这种。
  3. 看起来像个按钮,以后有可能会在这里可以点选切换 currentAccount 吗?

五、输入框职责问题:Tabs 和校验,哪个优先?

意识到第二节第 1 点里提到的,根据一个输入框分情况显示 Tabs 列表、校验通过、校验未通过 + Tip,在交互上有一个坑。

先来看看其他钱包咋做的,为什么没有问题

请问按我们的设计稿

输入框的第一职责是 match tabs content,还是校验输入内容?Tabs 和校验,哪个优先?

三个方向分析

方向 策略 缺点
方向一 视为平级,首先去模糊匹配 Tabs,匹配不到就开始校验 哪怕是比较好的处理了逐位输入、连续输入、复制粘贴情况,也难以避免会出现 Modal 高度的频繁抖动
方向二 校验优先:Tabs 只用来在进来时候点选,只要用户开始在 input 里连续输入,立马开始隐藏 失去模糊匹配 List 能力。开始输入跳一次高度
方向三 Tabs 优先:input 首先用来模糊匹配 Tabs,只在特定情况开始校验 需要理清、明确特定情况。输入正确跳一次高度

明确目标

不让这个 Modal 因为你每输入一个字符就「抖」,保留「从 Recents / Contacts / My Wallet 里快速搜人」的能力,并且在你输入完整后给出明确的校验/解析过程与结果(可用 / 不可用 / 解析中)。

选择方向三,并做出如下规则

1. 还没输入 / 正在输入时

下面一直是可选列表(Recents / Contacts / My Wallet),并且会跟着你的输入做筛选。

2. 只有当你输入「看起来已经是一整段地址/域名」时

列表才收起来,并把校验/解析的过程与结果用更明显的提示展示出来。

「看起来已经输完」的判定是按当前网络/链来的(为了多链兼容,也为了避免你输入到一半就被红字打断):

校验结果处理:

注意:域名只在支持的网络里开放;不支持的网络就只认地址

常见边界场景


六、Recipient Picker 其他的一些小问题

  1. Fetching address info 设计稿上,给了个 List Skeleton。应该给个单独的「正在校验中」设计稿。

  2. Bad ChainID 处:

    • 首先我不明白什么场景能出这个校验错误
    • 其次,我不明白为什么会把很多地址校验放在下一步 SendStates 里显现,不应该放在 Recipient Picker 更符合直觉吗?
    • 而且这两处校验 Tip 是不同样子的
  3. 没有给出真正意义上校验错误(地址不对、在诈骗黑名单地址)这类情况的设计稿。

  4. 注意市面上多链钱包点击 Send,多是先选 Token、再选 Recipient(Mega 是反过来)。

    • 因为 Token 里隐含了链的信息
    • 而交易历史、联系人可以是钱包级也可以是账户级的
    • (我不知道 bad chainId 是否和这个有关系)

七、Token Picker

黑白名单问题

  1. 晨阳说目前的 token list 是黑名单模式的,而黑名单模式与 New Token Found import/use 相悖
  2. 得明确一下,如果走白名单模式,白名单怎么去管理。import/use custom asset 资产管理,放在钱包、账户哪一级

其他问题


八、Send Successful

  1. SendStates Happy Case 下面有一句 Automatically close the modal upon completion,这个和下一阶段的 Successful Toast 不是相悖的?

  2. 2s ago 有点离谱,是不是还得整个定时器(现在 a few second ago)

  3. 没提如果 Send 失败的不同情况(上没上链怎么办)

    • 个人倾向于:不上链的错误在第二步弹 Toast 方便再次点击发送
    • 上链的错误加个 SendFailed 第三步

九、NFT & NFT List

(待补充)


十、Send 还可以通过其他方式打开

比如外面 NFT 列表直接点选发送,比如主动扫开一个 Receive QRCode。

三个入参都是可选、可任意组合的:

asset: AssetSchema,
recipient: z.string(),
amount: z.string(),

目前表现

  1. 如有 recipient 直接填上,复用校验 UI,如果校验过了无需主动点击 Next 就可以进入下一步(正常流程中需要主动点)
  2. 如有 asset 在进入第二步拉取完列表后做一次匹配,如果有 amount 就顺手填上
  3. 没 asset 单填 amount 无效

十一、设计稿的一些细节

组件 问题
RecipientPicker input 背景是白色的,高 40
TokenPicker input 背景是灰色的,高 44
Modal 底部 Button 高 48
View All 按钮 高 28
Button 组件定义 small/medium/large 是 32/44/52
RecipientPicker / SendStates 顶部标题距离内容区域 16
SendSuccess 顶部标题距离内容区域 22

另外:出现多个不在 CommonColor 里的颜色。

个人建议

同样层级、职责的地方,大小、间距这些应该一致,有助于保持视觉上的一致性提升产品质感。

可以定一个通用组件的尺寸范式,出一个新区域的设计稿的时候,根据范式限制自己、不能太过于自由发挥。


十二、PRD 相关问题

  1. GasFee/Nonce 不出现在 Send 里,好像没看到有钱包这么做,这么做的理由是什么?

  2. 为什么不一起把 ENS 处理了? 我理解这个要是不考虑到一起处理,后面再加容易堆成屎山代码。