Repository navigation
Releases
Releases · sctale/TapLedger
v0.11.21
一轮代码审查后的数据一致性与交互修复。
Bug 修复
- 合并导入产生重复记录:合并策略此前直接 INSERT,同一份备份导入两次(或导入本机已有数据)会生成同 uuid 的两行——明细与月度合计翻倍,同步也只更新其中一行。现按
uuid + 当前账本去重(含备份文件内部的重复 uuid),导入结果改为显示「实际新增」条数 - 备份携带同步水位:脱敏规则只匹配固定键名,漏掉了按账本动态拼接的
sync.last_push_at.<ledgerId>/sync.last_pull_at.<ledgerId>,水位会随备份导出;导入到另一台设备后跳过区间内的家人变更或本地未传变更。现改为按sync.前缀统一剔除 - 设备时钟偏快导致家人编辑长期不生效:服务端 push 时已把时间钳到服务端时刻,但本地行仍是未来值,pull 的
远端时间 > 本地时间永远为假;且 push 水位被顶到未来后,本地新记账再也传不上去。现本地时间超前时以服务端版本为准,同步结束把本地未来时间回落到服务端时间、并把异常水位拉回,下一轮自动补传 - 周期记账备注被输入法挡住:备注是表单最后一项,Dialog 窗口在 Android 15+ edge-to-edge 下不随键盘压缩,一弹键盘就盖住。现把备注上移到金额下方(名称 → 金额 → 备注 → 类型/分类/频率),编辑时始终可见
- 明细/统计页成员筛选残留:正在筛选的成员被移出家庭或自己退出登录后,筛选胶囊整行隐藏但筛选 id 仍在,列表/合计一直查空且无处复位。现随成员列表变化自动回到「全部」
体验
- 记录金额可点击编辑:此前编辑热区只覆盖图标与分类信息,点金额没有反应;现金额也进入编辑页(删除按钮仍独立在外,不影响无障碍操作)
v0.11.20
v0.11.19
v0.11.18
回退
- 撤销 0.11.17 的备注框改动(
f307ae3),记账页与编辑页都回到之前的样子:「+ 添加备注」的热区高度、keyboardDidShow后补paddingBottom再滚到底、备注框的「完成」键全部撤掉 - 撤掉的直接原因是它在记账页做了重复的键盘补偿:记账页那张卡是「上半 ScrollView + 卡底固定数字键盘」,卡底外面已经包着
KeyboardAvoidingView;再给滚动内容加一个键盘高的paddingBottom并强制scrollToEnd,等于把金额区和数字键盘一起顶出可视范围,看起来就是"改坏了" - 因此**「点备注框不顺畅」这个问题目前是未修复状态**(0.11.17 之前什么样,现在还是什么样)。下一版要动它得换路子:只补一层(要么交给
KeyboardAvoidingView,要么自己算高度但不叠加),并且不能把数字键盘滚出屏幕
v0.11.17
优化(触感反馈——第二次调振动,这次换了路子)
上一版只是把波形调轻,你没说清楚"哪里难受"也没关系——问题本来就不在大小上:expo-haptics 在 Android 上走的是直接驱动马达打自定义波形(Vibrator.vibrate(createWaveform(...)),轻档=50ms@30),而不是系统触感通道。Android 的触感设计原则把这类效果单列为「蜂鸣(buzz):噪杂、尖锐、穿透性强,振动停了还留余震」,举的坏例子恰恰是"按键按下后振动时间过长";expo 自己的 API 声明也写着"Vibrator API is not recommended for haptics feedback, use performAndroidHapticsAsync"。所以在它上面怎么调参数都只是选"哪种蜂鸣"。
- Android 改走
HapticFeedbackConstants(View.performHapticFeedback):波形由厂商按你这台设备调校、跟随系统触感开关、机型不支持时平台自己回退;iOS 继续用 UISelection / UINotification。 - 新增档位:设置 → 偏好 → 触感反馈 = 关闭 / 精简(默认)/ 完整,选完当场给一段样本,不用等下个版本才能试。
- 默认「精简」数字键盘按键、分类与收支切换不再振动,只在记一笔成功、失败或删除时反馈一下——这是 Things 3、Cash App 一路的克制:确认只出现在有意义的状态变化上。
- 想要按键反馈就切「完整」,那里用的是
SEGMENT_FREQUENT_TICK(系统定义:"预期极轻,连续触发也不难受;设备做不出足够轻的振动时干脆就不振"),并加 25ms 去重,避免同一次点击连发两下叠成嗡声。
修复(记账时的备注框)
- 点不中的第一半是热区太小:「+ 添加备注」实际可点区域不到 20dp 高,第一下经常点空。现在 40dp 最小高 + 上下各 12dp 的
hitSlop。 - 点完输入框被键盘盖住:原先在
onFocus时滚到底,那一刻键盘还没弹起、滚的位置没意义;Android 15+ 全屏模式下系统也不再压缩窗口,卡底的数字键盘和它上面的备注行一起被键盘挡住,看起来就像"点了没反应",得再点一次。现在改成监听keyboardDidShow拿真实高度 → 给内容补同高的paddingBottom→ 延一帧再滚到底,备注行精确停在键盘上沿(与编辑页已验证的做法对齐)。 - 备注框加「完成」键:写完按一下直接收起键盘回到数字键盘。编辑页(长按记录)同步以上三项。
v0.11.16
优化(报销页显示方式)
- 去掉套在条目外面的大框:原先「待报销合计 + 一键全部核销 + 所有记录」整块被一张卡包住,每条记录又在卡里各带一个框,两层框叠着显重。现在汇总单独一张小卡,记录列表和明细页一样直接铺在页面上(每条一格)
新增(报销页按成员筛选)
- 顶部加「👨👩👧 全部 / 😎 成员A / …」筛选条(多成员账本才显示,与统计页同款交互);待报销合计、笔数、列表都跟着筛选走,全家一起报账时能分开看每个人垫了多少
- 「一键全部核销」只核销当前筛选出来的那些:选中成员时按钮变成「核销 TA 的」,确认框也写明是谁的多少笔——批量写会同步到全家设备,作用范围必须和屏幕上看到的条目一致
- 选中的成员被移出家庭或退出登录时自动回到「全部」,不会停在一个查无此人的空列表上
- 数据层
getReimbursableSummary/getReimbursableRecords/markAllReimbursed统一加可选userId(0=全部),SQL 已用独立数据库验证过筛选与批量更新的作用范围
v0.11.15
v0.11.14
修复
- 报销页窄屏重叠:「核销」按钮盖在「待报销」徽章上(只剩个"消"字露出来)。原因是主行右侧要同时放「核销 + 金额」,左侧又要放「分类名 + 记账人 + 状态徽章」,在 393dp 宽的屏上总宽超出一行 —— RN 默认不裁剪溢出的子节点,于是按钮直接压在徽章上面
- 按「核销放到分类图标下面」的思路改:图标自成一列,核销/撤销按钮就在图标正下方(与图标同宽 40dp,左边缘对齐),右侧动作区只剩金额,主行腾出约 68dp,实测这一屏留出 37dp 余量
- 另给分类行加
flexWrap:更窄的屏(或系统大字号)下徽章会换到第二行,而不是再次溢出压到金额上 - 编辑热区相应变成「分类信息 + 日期备注」两块(图标不再可点,核销与删除仍各自独立可被读屏聚焦)
v0.11.13
v0.11.12
起因:报销管理页「看不到具体备注信息,不好区分」。查下来不是备注没存,而是行宽被挤没了:那一行的右侧要放「核销」按钮和金额,左侧信息列被压到约 60dp,而日期胶囊自己就占掉约 56dp —— 备注和它排在同一行、允许收缩,于是被压到零宽,屏幕上看着像"这条记录没有备注"。明细页没有核销按钮,所以同样的代码在那边只是截断、在这边是彻底消失。
修复
- 记录行的日期与备注改为整行宽度单独占一行(左边缘与分类文字对齐):不再和「核销 + 金额」抢宽度,报销页的备注、记账人、日期都能看全;备注由 1 行放宽到 2 行,长备注不再只露两三个字
- 顺带修好同一页缺的两处明细:记账人标识(此前该页没传成员缓存,全家一起报账时分不清是谁垫的)和点击条目进入编辑(此前该页条目点不开,长备注没有任何地方能看全)
- 影响面:明细页、统计页分类明细用同一个行组件,备注同样变成整行宽、最多两行(只是能看更多字,位置不变)
优化(触感反馈调柔)
用户反馈「振动太大了,点击反馈不舒服」。查 expo-haptics 的 Android 实现后确认这不是错觉:它在 Android 上是直接驱动马达的固定波形(不走系统触感通道),notificationAsync 因此天生偏重——成功是「40ms+停顿+40ms」双段共 180ms,失败是三段共 330ms,而这两档此前被用在记一笔成功、金额校验失败这类日常高频动作上。
- 日常确认改为单段轻击:
hapticSuccess由notificationAsync(Success)(双段 180ms)改为impactAsync(Soft)(单段 50ms,振幅 30) - 错误提示保留但减重:
hapticError由三段 330ms 改为impactAsync(Heavy)(单段 60ms,振幅 70)——错误仍要能被察觉,但不再是一串长震 hapticLight(数字键盘按键等,已是单段 50ms 最轻档)不变;三个入口仍集中在src/utils/haptics.ts,以后调强度只改这一处
新增(管理页状态灯)
- 「家庭同步」入口行右侧加连接状态灯:绿=已登录且
/api/health探测通过,灰=未配置 / 未登录 / 服务器不可达 / 正在检测。此前管理页只有一行文字摘要,看不出"同步到底还活着没",得点进二级页才知道 - 探测随管理页摘要一起刷新(进入该 Tab、同步完成、登录态变化),并沿用同步页的
mounted+ 序号防护,切走页面后旧响应不会回来盖掉新结果 - 读屏会念出「服务器已连接 / 未连接」,颜色不是唯一线索