From 82771bc103ad086763c26e63e7ad5838aa2f28bc Mon Sep 17 00:00:00 2001 From: doublex001 <16157008+doublex001@user.noreply.gitee.com> Date: Tue, 15 Sep 2026 13:09:15 +0800 Subject: [PATCH] =?UTF-8?q?fix(ui):=20=E4=BF=AE=E5=A4=8D=E5=A4=9A=E5=A4=84?= =?UTF-8?q?=E6=8C=89=E9=92=AE=E7=BB=91=E5=AE=9A=E7=A9=BA=E5=87=BD=E6=95=B0?= =?UTF-8?q?=E5=AF=BC=E8=87=B4=E7=82=B9=E5=87=BB=E6=97=A0=E5=8F=8D=E9=A6=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 9 个页面存在 onPress={() => {}} 的死控件,用户点击后无任何反馈,无法区分「功能不存在」与「App 卡住了」。按项目既有约定分别处理: - talent-recommendation:人才池快捷操作接入分发函数,「面试安排」改「面试评分」并跳 /interview-score(路由已存在),其余无对应页面者弹「功能开发中」 - hr-evaluation:「申诉」入口接 /appeal(路由已存在,此前是死按钮) - chat/[id] / holland-result / interview / onboarding:右上角「更多 / 分享」无对应页面,统一弹提示 - progress:右上角漏斗按钮与页内 FilterTabs 功能重复且点击无响应,直接移除,保留同尺寸占位维持标题居中 - resume/export:「保存」仅在数据就绪后渲染,loading/error 态不再出现点了无反应的入口 - enterprise-chat:空状态文案「人才库」→「人才推荐」,与实际路由名对齐 --- app/(enterprise)/enterprise-chat.tsx | 2 +- app/(enterprise)/talent-recommendation.tsx | 45 ++++++++++++++++++---- app/chat/[id].tsx | 7 +++- app/holland-result.tsx | 12 ++++-- app/hr-evaluation.tsx | 4 +- app/interview.tsx | 12 ++++-- app/onboarding.tsx | 12 ++++-- app/progress.tsx | 14 +++---- app/resume/export.tsx | 21 +++++++--- 9 files changed, 96 insertions(+), 33 deletions(-) diff --git a/app/(enterprise)/enterprise-chat.tsx b/app/(enterprise)/enterprise-chat.tsx index 5285b60..76c2104 100644 --- a/app/(enterprise)/enterprise-chat.tsx +++ b/app/(enterprise)/enterprise-chat.tsx @@ -193,7 +193,7 @@ function EmptyState({ 还没有沟通记录 - 从人才库中发现合适的候选人,主动发起沟通吧 + 从人才推荐中发现合适的候选人,主动发起沟通吧 去发现人才 diff --git a/app/(enterprise)/talent-recommendation.tsx b/app/(enterprise)/talent-recommendation.tsx index e4cbe28..37e127e 100644 --- a/app/(enterprise)/talent-recommendation.tsx +++ b/app/(enterprise)/talent-recommendation.tsx @@ -3,6 +3,7 @@ import { useRouter } from 'expo-router'; import { useState } from 'react'; import { ActivityIndicator, + Alert, Pressable, ScrollView, StyleSheet, @@ -140,7 +141,7 @@ function CandidateCard({ candidate }: { candidate: TalentCandidate }) { /* ===================== 子组件:人才池数据 ===================== */ -function TalentPool({ stats, actions }: { stats: { id: string; value: string; label: string }[]; actions: { icon: string; label: string }[] }) { +function TalentPool({ stats, actions, onPressAction }: { stats: { id: string; value: string; label: string }[]; actions: PoolActionItem[]; onPressAction: (action: PoolActionItem) => void }) { return ( 人才池数据 @@ -154,7 +155,7 @@ function TalentPool({ stats, actions }: { stats: { id: string; value: string; la {actions.map((action) => ( - + onPressAction(action)}> {action.label} @@ -217,10 +218,16 @@ function EmptyState({ /* ===================== 页面 ===================== */ -const POOL_ACTIONS = [ +/** + * 人才池快捷操作项:带 route 的跳转目标页,无对应页面的弹「功能开发中」提示。 + * 与 enterprise-chat.tsx 的 QuickActionItem 保持同一约定。 + */ +type PoolActionItem = { icon: string; label: string; route?: string }; + +const POOL_ACTIONS: PoolActionItem[] = [ { icon: 'mail-outline', label: '批量发邀请' }, { icon: 'document-text-outline', label: '批量发Offer' }, - { icon: 'calendar-outline', label: '面试安排' }, + { icon: 'calendar-outline', label: '面试评分', route: '/interview-score' }, { icon: 'notifications-outline', label: '群发通知' }, ]; @@ -229,6 +236,26 @@ export default function TalentRecommendationScreen() { const { recommendation, loading, error, refresh } = useTalentRecommendation(); const [activeTab, setActiveTab] = useState('all'); + // 人才池快捷操作分发:有目标路由则跳转,无对应页面则提示「功能开发中」, + // 避免按钮点击后无任何反馈。与 enterprise-chat.tsx 的 handleQuickAction 同约定。 + const handlePoolAction = (action: PoolActionItem) => { + if (action.route) { + router.push(action.route); + } else { + Alert.alert('提示', `${action.label}功能开发中,敬请期待`); + } + }; + + // 以下两处原先绑的是空函数(() => {}),按钮点击后无任何反馈。 + // 暂无对应页面,按项目约定弹「功能开发中」提示。 + const handleReport = () => { + Alert.alert('提示', '人才市场报告功能开发中,敬请期待'); + }; + + const handleFilter = () => { + Alert.alert('提示', '筛选条件功能开发中,敬请期待'); + }; + if (loading) { return ( @@ -264,18 +291,22 @@ export default function TalentRecommendationScreen() { {}} + onReport={handleReport} /> {recommendation.candidates.map((candidate) => ( ))} - + ) : ( {}} + onFilter={handleFilter} /> )} diff --git a/app/chat/[id].tsx b/app/chat/[id].tsx index 9907a33..d98c9b0 100644 --- a/app/chat/[id].tsx +++ b/app/chat/[id].tsx @@ -325,6 +325,11 @@ export default function ChatDetailScreen() { setTimeout(() => scrollRef.current?.scrollToEnd({ animated: true }), 100); }, [input, sending, sendMessage]); + // 右上角「更多」暂无对应菜单页,按本文件既有约定弹提示(此前为空函数,点了无反应) + const handleMore = () => { + Alert.alert('提示', '功能开发中,敬请期待'); + }; + if (loading) { return ( @@ -357,7 +362,7 @@ export default function ChatDetailScreen() { avatar={detail.avatar} online={detail.online} onBack={() => router.back()} - onMore={() => {}} + onMore={handleMore} /> {detail.matchInfo && ( diff --git a/app/holland-result.tsx b/app/holland-result.tsx index bc74188..bd61991 100644 --- a/app/holland-result.tsx +++ b/app/holland-result.tsx @@ -3,6 +3,7 @@ import { LinearGradient } from 'expo-linear-gradient'; import { useRouter } from 'expo-router'; import { ActivityIndicator, + Alert, Pressable, ScrollView, StyleSheet, @@ -228,10 +229,15 @@ export default function HollandResultScreen() { const { assessment, loading, error, refresh } = useHollandAssessment(); const result = assessment?.result; + // 右上角「分享」暂无对应页面,按项目约定弹提示(此前绑定空函数,点击无任何反馈) + const handleShare = () => { + Alert.alert('提示', '分享测评报告功能开发中,敬请期待'); + }; + if (loading) { return ( -
router.back()} onShare={() => {}} /> +
router.back()} onShare={handleShare} /> ); @@ -240,7 +246,7 @@ export default function HollandResultScreen() { if (error || !result) { return ( -
router.back()} onShare={() => {}} /> +
router.back()} onShare={handleShare} /> ); @@ -248,7 +254,7 @@ export default function HollandResultScreen() { return ( -
router.back()} onShare={() => {}} /> +
router.back()} onShare={handleShare} /> diff --git a/app/hr-evaluation.tsx b/app/hr-evaluation.tsx index ba15b4e..a01432e 100644 --- a/app/hr-evaluation.tsx +++ b/app/hr-evaluation.tsx @@ -256,7 +256,7 @@ export default function HREvaluationScreen() { if (loading) { return ( -
router.back()} onAppeal={() => {}} /> +
router.back()} onAppeal={() => router.push('/appeal')} /> ); @@ -265,7 +265,7 @@ export default function HREvaluationScreen() { if (error || !evaluation) { return ( -
router.back()} onAppeal={() => {}} /> +
router.back()} onAppeal={() => router.push('/appeal')} /> ); diff --git a/app/interview.tsx b/app/interview.tsx index 96f3315..9347a81 100644 --- a/app/interview.tsx +++ b/app/interview.tsx @@ -2,6 +2,7 @@ import { Ionicons } from '@expo/vector-icons'; import { useRouter } from 'expo-router'; import { ActivityIndicator, + Alert, Pressable, ScrollView, StyleSheet, @@ -289,10 +290,15 @@ export default function InterviewScreen() { await start(); }; + // 右上角「分享」暂无对应页面,按项目约定弹提示(此前绑定空函数,点击无任何反馈) + const handleShare = () => { + Alert.alert('提示', '分享面试配置功能开发中,敬请期待'); + }; + if (loading) { return ( -
router.back()} onShare={() => {}} /> +
router.back()} onShare={handleShare} /> ); @@ -301,7 +307,7 @@ export default function InterviewScreen() { if (error || !data) { return ( -
router.back()} onShare={() => {}} /> +
router.back()} onShare={handleShare} /> ); @@ -309,7 +315,7 @@ export default function InterviewScreen() { return ( -
router.back()} onShare={() => {}} /> +
router.back()} onShare={handleShare} /> diff --git a/app/onboarding.tsx b/app/onboarding.tsx index 380a206..9b28bd6 100644 --- a/app/onboarding.tsx +++ b/app/onboarding.tsx @@ -4,6 +4,7 @@ import { useRouter } from 'expo-router'; import { useEffect, useState } from 'react'; import { ActivityIndicator, + Alert, Pressable, ScrollView, StyleSheet, @@ -267,10 +268,15 @@ export default function OnboardingScreen() { await toggle(itemId, done); }; + // 右上角「分享」暂无对应页面,按项目约定弹提示(此前绑定空函数,点击无任何反馈) + const handleShare = () => { + Alert.alert('提示', '分享入职清单功能开发中,敬请期待'); + }; + if (loading) { return ( -
router.back()} onShare={() => {}} /> +
router.back()} onShare={handleShare} /> ); @@ -279,7 +285,7 @@ export default function OnboardingScreen() { if (error || !display) { return ( -
router.back()} onShare={() => {}} /> +
router.back()} onShare={handleShare} /> ); @@ -287,7 +293,7 @@ export default function OnboardingScreen() { return ( -
router.back()} onShare={() => {}} /> +
router.back()} onShare={handleShare} /> = { /* ===================== 子组件:顶部导航 ===================== */ -function Header({ onBack, onFilter }: { onBack: () => void; onFilter: () => void }) { +function Header({ onBack }: { onBack: () => void }) { return ( 求职进度 - - - + {/* 原右侧漏斗筛选按钮与页内 FilterTabs 功能重复且点击无反应,已移除。 + 此处保留同尺寸占位以维持标题居中。 */} + ); } @@ -242,7 +242,7 @@ export default function ProgressScreen() { if (loading) { return ( -
router.back()} onFilter={() => {}} /> +
router.back()} /> ); @@ -251,7 +251,7 @@ export default function ProgressScreen() { if (error || !progress) { return ( -
router.back()} onFilter={() => {}} /> +
router.back()} /> ); @@ -259,7 +259,7 @@ export default function ProgressScreen() { return ( -
router.back()} onFilter={() => {}} /> +
router.back()} /> diff --git a/app/resume/export.tsx b/app/resume/export.tsx index 40f44dd..ec1b0d7 100644 --- a/app/resume/export.tsx +++ b/app/resume/export.tsx @@ -36,16 +36,25 @@ const TEMPLATE_COLORS: Record = { /* ===================== 子组件:顶部导航 ===================== */ -function Header({ onBack, onSave }: { onBack: () => void; onSave: () => void }) { +/** + * 顶部导航。onSave 可选:加载中 / 加载失败时设置尚未就绪(localSettings 为 null), + * 此时不渲染「保存」按钮,避免出现点了无反应的入口(比照 progress.tsx 移除无效按钮的处理)。 + * 该态下仍渲染同尺寸占位,维持标题居中。 + */ +function Header({ onBack, onSave }: { onBack: () => void; onSave?: () => void }) { return ( 导出简历 - - 保存 - + {onSave ? ( + + 保存 + + ) : ( + + )} ); } @@ -264,7 +273,7 @@ export default function ResumeExportScreen() { if (loading) { return ( -
router.back()} onSave={() => {}} /> +
router.back()} /> ); @@ -273,7 +282,7 @@ export default function ResumeExportScreen() { if (error || !localSettings) { return ( -
router.back()} onSave={() => {}} /> +
router.back()} /> );