Browse Source

fix: 修复企业端 P0 逻辑断裂(聊天跳转 + 人才详情路由参数)

- enterprise-chat ChatRow 增加 onPress,点击进入 /chat/[id] 会话详情
- talent-recommendation 详情按钮跳转携带 ?id= 参数
- candidate-detail 从 useLocalSearchParams 读取 id(兜底 candidate-1)
- fetchCandidateDetail 按 id 回填候选人身份字段,避免不同候选人显示同一份资料
master
doublex001 2 months ago
parent
commit
b8462676a5
  1. 3
      app/(enterprise)/enterprise-chat.tsx
  2. 2
      app/(enterprise)/talent-recommendation.tsx
  3. 6
      app/candidate-detail.tsx
  4. 28
      src/api/api.ts

3
app/(enterprise)/enterprise-chat.tsx

@ -108,8 +108,9 @@ function PendingTasks({ tasks }: { tasks: PendingTask[] }) {
/* ===================== 子组件:聊天列表项 ===================== */ /* ===================== 子组件:聊天列表项 ===================== */
function ChatRow({ chat }: { chat: EnterpriseChatItem }) { function ChatRow({ chat }: { chat: EnterpriseChatItem }) {
const router = useRouter();
return ( return (
<Pressable style={styles.chatRow}> <Pressable style={styles.chatRow} onPress={() => router.push('/chat/' + chat.id)}>
<View style={styles.chatAvatar}> <View style={styles.chatAvatar}>
<Text style={styles.chatAvatarText}>{chat.avatar}</Text> <Text style={styles.chatAvatarText}>{chat.avatar}</Text>
</View> </View>

2
app/(enterprise)/talent-recommendation.tsx

@ -130,7 +130,7 @@ function CandidateCard({ candidate }: { candidate: TalentCandidate }) {
<Pressable style={styles.chatBtn} onPress={() => router.push('/enterprise-chat')}> <Pressable style={styles.chatBtn} onPress={() => router.push('/enterprise-chat')}>
<Text style={styles.chatBtnText}>发起沟通</Text> <Text style={styles.chatBtnText}>发起沟通</Text>
</Pressable> </Pressable>
<Pressable style={styles.detailBtn} onPress={() => router.push('/candidate-detail')}> <Pressable style={styles.detailBtn} onPress={() => router.push('/candidate-detail?id=' + candidate.id)}>
<Text style={styles.detailBtnText}>查看详情</Text> <Text style={styles.detailBtnText}>查看详情</Text>
</Pressable> </Pressable>
</View> </View>

6
app/candidate-detail.tsx

@ -1,5 +1,5 @@
import { Ionicons } from '@expo/vector-icons'; import { Ionicons } from '@expo/vector-icons';
import { useRouter } from 'expo-router'; import { useLocalSearchParams, useRouter } from 'expo-router';
import { import {
ActivityIndicator, ActivityIndicator,
Pressable, Pressable,
@ -298,7 +298,9 @@ function HireSuggestionCard({
export default function CandidateDetailScreen() { export default function CandidateDetailScreen() {
const router = useRouter(); const router = useRouter();
const { candidate, loading, error, invite, inviting, invited } = useCandidateDetail('candidate-1'); const { id } = useLocalSearchParams<{ id: string }>();
const candidateId = (id && id.length > 0) ? id : 'candidate-1';
const { candidate, loading, error, invite, inviting, invited } = useCandidateDetail(candidateId);
if (loading) { if (loading) {
return ( return (

28
src/api/api.ts

@ -2613,6 +2613,16 @@ const MOCK_CANDIDATE_DETAIL: CandidateDetail = {
invited: false, invited: false,
}; };
/** 候选人身份覆盖(mock 阶段按 id 回填姓名/年龄/城市等基本信息,避免不同候选人显示同一份资料) */
const CANDIDATE_IDENTITY_OVERRIDE: Record<
string,
{ name: string; age: number; city: string; matchPercent: number; overallScore: number; percentile: number }
> = {
'cand-1': { name: '张明远', age: 28, city: '北京', matchPercent: 96, overallScore: 88, percentile: 99 },
'cand-2': { name: '李雨桐', age: 26, city: '北京', matchPercent: 82, overallScore: 75, percentile: 75 },
'cand-3': { name: '王建国', age: 33, city: '北京', matchPercent: 91, overallScore: 92, percentile: 92 },
};
/** /**
* 获取候选人详情 * 获取候选人详情
* @method GET * @method GET
@ -2622,8 +2632,22 @@ const MOCK_CANDIDATE_DETAIL: CandidateDetail = {
*/ */
export async function fetchCandidateDetail(candidateId: string): Promise<CandidateDetail> { export async function fetchCandidateDetail(candidateId: string): Promise<CandidateDetail> {
// TODO: const res = await fetch(`${API_BASE_URL}/api/enterprise/candidates/${candidateId}`, { method: 'GET' }); return res.json(); // TODO: const res = await fetch(`${API_BASE_URL}/api/enterprise/candidates/${candidateId}`, { method: 'GET' }); return res.json();
void candidateId; const override =
return mockRequest({ ...MOCK_CANDIDATE_DETAIL }); CANDIDATE_IDENTITY_OVERRIDE[candidateId] ?? CANDIDATE_IDENTITY_OVERRIDE['cand-1'];
const detail: CandidateDetail = {
...MOCK_CANDIDATE_DETAIL,
id: candidateId,
matchPercent: override.matchPercent,
overallScore: override.overallScore,
percentile: override.percentile,
basicInfo: {
...MOCK_CANDIDATE_DETAIL.basicInfo,
name: override.name,
age: override.age,
city: override.city,
},
};
return mockRequest(detail);
} }
/** /**

Loading…
Cancel
Save