From 7bef729e9333a11364c33cf1cce25bde1a21829d Mon Sep 17 00:00:00 2001 From: ozh Date: Thu, 17 Sep 2026 14:19:59 +0800 Subject: [PATCH] =?UTF-8?q?feat(family):=20=E9=82=80=E8=AF=B7=E4=BD=93?= =?UTF-8?q?=E9=AA=8C=E4=BC=98=E5=8C=96=E2=80=94=E2=80=94=E6=95=B4=E8=A1=8C?= =?UTF-8?q?=E5=8F=AF=E7=82=B9=E6=8B=89=E8=B5=B7=E5=88=86=E4=BA=AB=E3=80=81?= =?UTF-8?q?=E5=88=86=E4=BA=AB=E6=96=87=E6=A1=88=E5=B8=A6=E9=82=80=E8=AF=B7?= =?UTF-8?q?=E4=BA=BA=E3=80=81=E5=8F=97=E9=82=80=E7=9B=B4=E8=BE=BE=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E5=8A=A0=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 邀请行改为 open-type=share 的 Button 铺满整行,整行任意位置可点,视觉与普通行一致 - 分享标题带邀请人昵称:「XX 邀请你加入家庭圈「XX」」 - 接收方从分享卡进入:未登录先登录回跳,已登录且非成员时自动调 joinHome 完成加入,无需手动点击 --- src/pages/family/detail.module.scss | 33 ++++++++--------- src/pages/family/detail.tsx | 56 +++++++++++++++++++++-------- 2 files changed, 59 insertions(+), 30 deletions(-) diff --git a/src/pages/family/detail.module.scss b/src/pages/family/detail.module.scss index 0a80408..9267d3f 100644 --- a/src/pages/family/detail.module.scss +++ b/src/pages/family/detail.module.scss @@ -74,15 +74,31 @@ margin-top: 24px; } -// 邀请行:与 ListRow 同款外观,但右侧为 open-type=share 的原生 Button(触发转发面板) +// 邀请行:open-type=share 的原生 Button 铺满整行(整行可点拉起转发面板),样式与 ListRow 一致 .shareRow { display: flex; align-items: center; justify-content: space-between; + width: 100%; min-height: 104px; padding: 0 32px; + box-sizing: border-box; + margin: 0; background: $color-bg-white; + border: none; border-bottom: 1px solid $color-border; + border-radius: 0; + font-size: inherit; + line-height: inherit; + text-align: left; + + &::after { + border: none; + } +} + +.shareRowPressed { + background: $color-bg-press; } .shareLabel { @@ -90,21 +106,6 @@ color: $color-text; } -// 清除小程序 Button 原生样式(边框/底色/行高),仅保留命中区 -.shareBtn { - margin: 0; - padding: 0; - width: auto; - min-width: 0; - background: transparent; - border: none; - line-height: inherit; - - &::after { - border: none; - } -} - .shareArrow { font-size: 36px; color: $color-text-placeholder; diff --git a/src/pages/family/detail.tsx b/src/pages/family/detail.tsx index e8e8b59..b44a6e7 100644 --- a/src/pages/family/detail.tsx +++ b/src/pages/family/detail.tsx @@ -1,5 +1,6 @@ import { useState } from 'react' import { useRouter, useDidShow, useShareAppMessage } from '@tarojs/taro' +import Taro from '@tarojs/taro' import { View, Text, Button } from '@tarojs/components' import { useAppSelector } from '@/store/hooks' import { Navbar } from '@/components/navbar' @@ -7,7 +8,7 @@ import { Loading } from '@/components/loading' import { StateView } from '@/components/state-view' import { FamilyCard } from '@/components/family-card' import { ListRow, ListRowGroup } from '@/components/list-row' -import { getHomeDetail, getHomeMemberList, type HomeInfo, type HomeMember } from '@/api/home' +import { getHomeDetail, getHomeMemberList, joinHome, type HomeInfo, type HomeMember } from '@/api/home' import { getCareMemberList, type CareMember } from '@/api/careMember' import { MAX_CARED_PER_FAMILY } from '@/constants/family' import { ROUTES } from '@/constants/routes' @@ -30,9 +31,12 @@ const contactsSummary = (c: CareMember): string => { export default function FamilyDetail() { const router = useRouter() const familyId = router.params.id ?? '' + const isInviteEnter = router.params.invite === '1' const token = useAppSelector((s) => s.auth.token) + const myUserId = useAppSelector((s) => s.auth.userId) const [loading, setLoading] = useState(true) + const [joining, setJoining] = useState(false) const [family, setFamily] = useState(null) const [members, setMembers] = useState([]) const [caredList, setCaredList] = useState([]) @@ -62,14 +66,39 @@ export default function FamilyDetail() { } } - // 从添加表单返回时刷新 + // 从添加表单返回时刷新;受邀进入且尚未是成员时自动加入(跳过手动点击步骤) useDidShow(() => { - load() + load().then(() => { + if ( + !isInviteEnter || joining || myUserId == null || + members.length === 0 || members.some((m) => m.memberId === myUserId) + ) return + autoJoin(familyId) + }) }) - // 邀请分享:接收方从分享卡进入本页后点「加入」走 joinHome(code) + // 受邀直达:已登录但非成员时自动加入,无需手点 + const autoJoin = async (homeId: string) => { + if (joining) return + setJoining(true) + try { + await joinHome(homeId) + showToast('已加入家庭') + await load() + } catch (e) { + showToast(e instanceof Error ? e.message : '加入失败') + } finally { + setJoining(false) + } + } + + // 邀请分享:接收方点分享卡直达本页,登录后自动加入 + const inviterName = () => { + const me = members.find((m) => m.memberId === myUserId) + return memberName(me ?? members[0]) + } useShareAppMessage(() => ({ - title: `邀请你加入家庭圈「${family?.name ?? ''}」`, + title: `${inviterName()} 邀请你加入家庭圈「${family?.name ?? ''}」`, path: `${ROUTES.FAMILY_DETAIL}?id=${familyId}&invite=1` })) @@ -167,16 +196,15 @@ export default function FamilyDetail() { - {/* open-type=share 触发右上角同款转发面板;Button 原生样式清除交由 shareBtn 样式接管 */} - + {/* open-type=share 的 Button 铺满整行做命中区,样式与普通 ListRow 一致 */} + - + › +