Skip to content

Commit

Permalink
🐞 fix:merge
Browse files Browse the repository at this point in the history
  • Loading branch information
eleliauk committed Sep 11, 2024
2 parents a5e5def + c7e68f2 commit 26f5f1c
Show file tree
Hide file tree
Showing 11 changed files with 552 additions and 71 deletions.
Binary file added src/common/assets/img/publishQuestion/answer.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
96 changes: 53 additions & 43 deletions src/common/components/QuestionDetail/QuestionDetail.tsx
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
import { Image, Text, View } from '@tarojs/components';

Check warning on line 1 in src/common/components/QuestionDetail/QuestionDetail.tsx

View workflow job for this annotation

GitHub Actions / lint-and-format

Run autofix to sort these imports!
import React, { useEffect, useState } from 'react';

import './index.scss';

// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
import answericon from '@/common/assets/img/publishQuestion/answer.png';
import askicon from '@/common/assets/img/publishQuestion/ask.png';
import PublishHeader from '@/common/components/PublishHeader/PublishHeader';
import { useCourseStore } from '@/pages/main/store/store';

import IconFont from '../iconfont';
import './index.scss';

interface IUser {
avatar: string;
Expand Down Expand Up @@ -51,7 +51,7 @@ interface IAnswer {

interface IQuestionProps {
question: IQuestion;
answers: IAnswer[];
answers: IAnswer[] | null;
}

const formatTime = (timestamp: number) => {
Expand All @@ -69,24 +69,35 @@ const QuestionDetail: React.FC<IQuestionProps> = ({ question, answers }) => {
const dispatch = useCourseStore(({ getPublishers }) => ({ getPublishers }));

const [questionDetail, setQuestion] = useState<IQuestion>(question);
const [answersDetail, setAnswers] = useState<IAnswer[]>(answers);
const [answersDetail, setAnswers] = useState<IAnswer[] | null>(answers);

useEffect(() => {
const fetchAllPublishers = async () => {
// 函数,用于获取每个答案的用户信息
async function getAnswersWithUserInfo(ianswers: IAnswer[]) {
const answersWithUserInfo = await Promise.all(
ianswers.map(async (answer) => {
const user = await dispatch.getPublishers(answer.publisher_id);
return { ...answer, user };
})
);
return answersWithUserInfo;
try {
const answersWithUserInfo = await Promise.all(
ianswers.map(async (answer) => {
const user = await dispatch.getPublishers(answer.publisher_id);
return { ...answer, user };
})
);
return answersWithUserInfo;
} catch (error) {
// 处理错误,返回一个空数组或其他适当的默认值
console.error('Error fetching user info:', error);
return []; // 返回一个空数组
}
}

// 调用函数并处理结果
const answersWithUserInfo = await getAnswersWithUserInfo(answers);
setAnswers(answersWithUserInfo);
// 确保 answers 不为 null
if (answers !== null) {
const answersWithUserInfo = await getAnswersWithUserInfo(answers);
setAnswers(answersWithUserInfo);
} else {
// 如果 answers 为 null,可以选择设置一个空数组或者执行其他逻辑
setAnswers([]);
}

// 函数,用于获取问题的提问者用户信息
async function getQuestionWithUserInfo(iquestion: IQuestion) {
Expand All @@ -106,7 +117,7 @@ const QuestionDetail: React.FC<IQuestionProps> = ({ question, answers }) => {
};

void fetchAllPublishers();
});
}, [question, answers]);
return (
<View className="questionDetail">
<View className="question-detail">
Expand All @@ -124,36 +135,35 @@ const QuestionDetail: React.FC<IQuestionProps> = ({ question, answers }) => {
</View>
</View>
<View className="answer-list">
{answersDetail.map((answer, index) => (
<View key={index} className="answer-item">
<PublishHeader
avatarUrl={answer?.user?.avatar ?? ''}
nickName={answer?.user?.nickname ?? ''}
date={formatTime(answer.ctime)}
/>
<View className="question-item">
{
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
<Image src={askicon} className="askicon"></Image>
}
<View className="answer-content">
本网站使用cookies以提升您的使用体验及统计网站流量相关数据。继续使用本网站表示您同意我们使用cookies。我们的《隐私及Cookie政策》提供更多关于cookies使用及停用的相关信息。
</View>
</View>
<View className="answer-statistics">
<View className="icon">
<IconFont name="comment" />
{/* <Navigator className="iconfont">&#xe769;</Navigator> */}
{answersDetail &&
answersDetail.map((answer, index) => (
<View key={index} className="answer-item">
<PublishHeader
avatarUrl={answer?.user?.avatar ?? ''}
nickName={answer?.user?.nickname ?? ''}
date={formatTime(answer.ctime)}
/>
<View className="question-item">
{
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
<Image src={answericon} className="askicon"></Image>
}
<View className="answer-content">{answer?.content}</View>
</View>
<Text className="text1">{answer.total_comment_count}</Text>
<View className="icon">
<IconFont name="like" />
{/* <Navigator className="iconfont">&#xe786;</Navigator> */}
<View className="answer-statistics">
<View className="icon">
<IconFont name="comment" />
{/* <Navigator className="iconfont">&#xe769;</Navigator> */}
</View>
<Text className="text1">{answer.total_comment_count}</Text>
<View className="icon">
<IconFont name="like" />
{/* <Navigator className="iconfont">&#xe786;</Navigator> */}
</View>
<Text className="text1">{answer.total_support_count}</Text>
</View>
<Text className="text1">{answer.total_support_count}</Text>
</View>
</View>
))}
))}
</View>
</View>
);
Expand Down
133 changes: 133 additions & 0 deletions src/common/components/QuestionListComponent/QuestionListComponent.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
/* eslint-disable import/first */
import { Image, View } from '@tarojs/components';
import Taro from '@tarojs/taro';
import React, { useEffect, useState } from 'react';

import './index.scss';

import answericon from '@/common/assets/img/publishQuestion/answer.png';
import askicon from '@/common/assets/img/publishQuestion/ask.png';
import PublishHeader from '@/common/components/PublishHeader/PublishHeader';
import { useCourseStore } from '@/pages/main/store/store';

interface IUser {
avatar: string;
id: number;
nickname: string;
}

interface IQuestion {
id: number;
questioner_id: number;
biz: string;
biz_id: number;
content: string;
answer_cnt: number;
preview_answers: Array<{
id: number;
publisher_id: number;
question_id: number;
content: string;
utime: number;
ctime: number;
user?: IUser;
}>;
utime: number;
ctime: number;
user?: IUser;
}

const formatTime = (timestamp: number) => {
const date = new Date(timestamp);
const year = date.getFullYear();
const month = (date.getMonth() + 1).toString().padStart(2, '0');
const day = date.getDate().toString().padStart(2, '0');
const hour = date.getHours().toString().padStart(2, '0');
const minute = date.getMinutes().toString().padStart(2, '0');
const second = date.getSeconds().toString().padStart(2, '0');
return `${year}-${month}-${day} ${hour}:${minute}:${second}`;
};

const QuestionListComponent: React.FC<{ question: IQuestion }> = ({ question }) => {
const dispatch = useCourseStore(({ getPublishers }) => ({ getPublishers }));

const [questionDetail, setQuestion] = useState<IQuestion>(question);

useEffect(() => {
const fetchQuestionWithUserInfo = async () => {
try {
const user = await dispatch.getPublishers(question.questioner_id);
const questionWithUserInfo = { ...question, user };
setQuestion(questionWithUserInfo);

// 检查 preview_answers 是否存在并且是一个数组
const previewAnswersWithUserInfo =
question.preview_answers && question.preview_answers.length > 0
? await Promise.all(
question.preview_answers.map(async (answer) => {
const newuser = await dispatch.getPublishers(answer.publisher_id);
return { ...answer, newuser };
})
)
: [];

// 更新问题状态,包括填充了用户信息的 preview_answers
setQuestion((prev) => ({
...prev,
user: questionWithUserInfo.user, // 确保用户信息被设置
preview_answers: previewAnswersWithUserInfo,
}));
} catch (error) {
console.error('Error fetching question with user info:', error);
}
};

void fetchQuestionWithUserInfo();
}, [question]);

const handleQuestionDetailClick = () => {
void Taro.navigateTo({
url: `/pages/questionInfo/index?id=${questionDetail.id}`,
});
};

return (
<View className="questionDetail" onClick={handleQuestionDetailClick}>
<View className="question-detail">
<PublishHeader
avatarUrl={questionDetail?.user?.avatar ?? ''}
nickName={questionDetail?.user?.nickname ?? ''}
date={formatTime(questionDetail?.ctime)}
/>
<View className="question-item">
{
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
<Image src={askicon} className="askicon" />
}
<View className="question-value">{questionDetail.content}</View>
</View>
</View>
<View className="answer-list">
{questionDetail.preview_answers &&
questionDetail.preview_answers.map((answer, index) => (
<View key={index} className="answer-item">
<PublishHeader
avatarUrl={answer?.user?.avatar ?? ''}
nickName={answer?.user?.nickname ?? ''}
date={formatTime(answer.ctime)}
/>
<View className="question-item">
{
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
<Image src={answericon} className="askicon" />
}
<View className="answer-content">{answer.content}</View>
</View>
</View>
))}
</View>
</View>
);
};

export default QuestionListComponent;
73 changes: 73 additions & 0 deletions src/common/components/QuestionListComponent/index.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
.questionDetail {
background-color: #f9f9f2;
width: 659.42rpx;
position: relative;
left: 50%;
transform: translateX(-50%);
display: flex;
flex-direction: column;
align-items: center;
margin: 20rpx 0;
}

.question-detail {
width: 603.26rpx;
border-bottom: #e3e3e3 solid 2rpx;
padding-top: 40rpx;
padding-bottom: 35rpx;
}

.answer-item {
@extend .question-detail;
}

.askicon {
width: 44.44rpx;
height: 47.05rpx;
margin-left: 22rpx;
margin-right: 60rpx;
}

.question-item {
font-size: 21.74rpx;
color: #565552;
display: flex;
margin-top: 20rpx;
}

.question-value {
max-width: 471rpx;
margin-top: 5rpx;
}

.answer-content {
@extend .question-value;
}

.icon {
width: 40rpx;
height: 40rpx;
box-shadow: 0rpx 5rpx 11rpx 2rpx rgba(0, 0, 0, 0.16);
opacity: 1;
border-radius: 50%;
display: inline-block;
text-align: center;
line-height: 40rpx;
// margin-left: 15rpx;
Image {
width: 100%;
height: 100%;
}
}
.text1 {
font-size: 22rpx;
font-weight: bold;
color: #565552;
margin: 0 10rpx;
}

.answer-statistics {
display: flex;
align-items: center;
margin-left: 450rpx;
}
4 changes: 4 additions & 0 deletions src/pages/QuestionList/index.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
export default definePageConfig({
navigationBarTitleText: '问问同学',
navigationBarBackgroundColor: '#F9F9F2',
});
Empty file.
Loading

0 comments on commit 26f5f1c

Please sign in to comment.