优化省市区和占位图片
This commit is contained in:
@@ -5,8 +5,9 @@ import img from "../../config/images";
|
||||
import { ListCardProps } from "../../../types/list/types";
|
||||
import { formatGameTime, calculateDuration } from "@/utils/timeUtils";
|
||||
import { navigateTo } from "@/utils/navigation";
|
||||
import images from '@/config/images'
|
||||
import images from "@/config/images";
|
||||
import "./index.scss";
|
||||
import { OSS_BASE } from "@/config/api";
|
||||
|
||||
const ListCard: React.FC<ListCardProps> = ({
|
||||
id,
|
||||
@@ -45,7 +46,7 @@ const ListCard: React.FC<ListCardProps> = ({
|
||||
className="image"
|
||||
mode="aspectFill"
|
||||
lazyLoad
|
||||
defaultSource={require("@/static/emptyStatus/publish-empty-card.png")}
|
||||
defaultSource={`${OSS_BASE}/front/ball/images/publish-empty-card.svg`}
|
||||
/>
|
||||
);
|
||||
};
|
||||
@@ -67,7 +68,9 @@ const ListCard: React.FC<ListCardProps> = ({
|
||||
const containerWidthPx = screenWidth - 130;
|
||||
|
||||
// 计算固定信息宽度
|
||||
const extraInfo = `${court_type ? `・${court_type}` : ''}${distance_km ? `・${distance_km}km` : ''}`;
|
||||
const extraInfo = `${court_type ? `・${court_type}` : ""}${
|
||||
distance_km ? `・${distance_km}km` : ""
|
||||
}`;
|
||||
|
||||
// 估算字符宽度(基于 12px 字体)
|
||||
const getTextWidth = (text: string) => {
|
||||
@@ -98,7 +101,9 @@ const ListCard: React.FC<ListCardProps> = ({
|
||||
let currentWidth = 0;
|
||||
for (let i = 0; i < location.length; i++) {
|
||||
const char = location[i];
|
||||
const charWidth = /[\u4e00-\u9fa5\u3000-\u303f\uff00-\uffef]/.test(char) ? 12 : 6;
|
||||
const charWidth = /[\u4e00-\u9fa5\u3000-\u303f\uff00-\uffef]/.test(char)
|
||||
? 12
|
||||
: 6;
|
||||
if (currentWidth + charWidth > availableWidth) {
|
||||
break;
|
||||
}
|
||||
@@ -106,7 +111,7 @@ const ListCard: React.FC<ListCardProps> = ({
|
||||
maxChars++;
|
||||
}
|
||||
|
||||
return location.slice(0, maxChars) + '...';
|
||||
return location.slice(0, maxChars) + "...";
|
||||
}, [location, court_type, distance_km]);
|
||||
|
||||
// 根据图片数量决定展示样式
|
||||
@@ -220,9 +225,10 @@ const ListCard: React.FC<ListCardProps> = ({
|
||||
</Text>
|
||||
</View>
|
||||
<View className="tag ntprTag">
|
||||
<Image src={images.ICON_LIST_NTPR} className='ntprIcon' />
|
||||
<Image src={images.ICON_LIST_NTPR} className="ntprIcon" />
|
||||
<Text className="tag-text">
|
||||
{Number(skill_level_min)?.toFixed(1)} - {Number(skill_level_max)?.toFixed(1)}
|
||||
{Number(skill_level_min)?.toFixed(1)} -{" "}
|
||||
{Number(skill_level_max)?.toFixed(1)}
|
||||
</Text>
|
||||
{/* 分割线 */}
|
||||
<View className="typeLine" />
|
||||
@@ -251,22 +257,16 @@ const ListCard: React.FC<ListCardProps> = ({
|
||||
/>
|
||||
{/* <Text className="smoothTitle">{game_type}</Text> */}
|
||||
</View>
|
||||
{
|
||||
venue_description && (<View className="line" />)
|
||||
}
|
||||
{
|
||||
venue_description &&
|
||||
(
|
||||
|
||||
<View className="localAreaContainer">
|
||||
<View className="localAreaTitle">场馆方:</View>
|
||||
<View className="localAreaWrapper">
|
||||
<Image className="localArea" src={venueImage} />
|
||||
<Text className="localAreaText">{venue_description}</Text>
|
||||
</View>
|
||||
{venue_description && <View className="line" />}
|
||||
{venue_description && (
|
||||
<View className="localAreaContainer">
|
||||
<View className="localAreaTitle">场馆方:</View>
|
||||
<View className="localAreaWrapper">
|
||||
<Image className="localArea" src={venueImage} />
|
||||
<Text className="localAreaText">{venue_description}</Text>
|
||||
</View>
|
||||
)
|
||||
}
|
||||
</View>
|
||||
)}
|
||||
</View>
|
||||
)}
|
||||
</View>
|
||||
|
||||
@@ -24,7 +24,6 @@ const ListLoadError = (props: IProps) => {
|
||||
wrapperHeight = "",
|
||||
width = "",
|
||||
height = "",
|
||||
scale = "",
|
||||
} = props;
|
||||
const handleReload = () => {
|
||||
reload && typeof reload === "function" && reload();
|
||||
@@ -34,7 +33,7 @@ const ListLoadError = (props: IProps) => {
|
||||
<View className={styles.listLoadError} style={{ height: wrapperHeight }}>
|
||||
<Image
|
||||
className={styles.listLoadErrorImg}
|
||||
style={{ width, height, transform: `scale(${scale})` }}
|
||||
style={{ width, height }}
|
||||
src={errorImg ? img[errorImg] : img.ICON_LIST_LOAD_ERROR}
|
||||
/>
|
||||
{text && <Text className={styles.listLoadErrorText}>{text}</Text>}
|
||||
|
||||
@@ -6,7 +6,11 @@ import "./index.scss";
|
||||
import { EditModal } from "@/components";
|
||||
import { UserService, PickerOption } from "@/services/userService";
|
||||
import { PopupPicker } from "@/components/Picker/index";
|
||||
import { useUserActions, useNicknameChangeStatus, useLastTestResult } from "@/store/userStore";
|
||||
import {
|
||||
useUserActions,
|
||||
useNicknameChangeStatus,
|
||||
useLastTestResult,
|
||||
} from "@/store/userStore";
|
||||
import { UserInfoType } from "@/services/userService";
|
||||
import {
|
||||
useCities,
|
||||
@@ -82,7 +86,8 @@ const UserInfoCardComponent: React.FC<UserInfoCardProps> = ({
|
||||
}) => {
|
||||
const nickname_change_status = useNicknameChangeStatus();
|
||||
const { setShowGuideBar } = useGlobalState();
|
||||
const { updateUserInfo, updateNickname, fetchLastTestResult } = useUserActions();
|
||||
const { updateUserInfo, updateNickname, fetchLastTestResult } =
|
||||
useUserActions();
|
||||
const ntrpLevels = useNtrpLevels();
|
||||
// 使用全局状态中的测试结果,避免重复调用接口
|
||||
const lastTestResult = useLastTestResult();
|
||||
@@ -295,8 +300,8 @@ const UserInfoCardComponent: React.FC<UserInfoCardProps> = ({
|
||||
|
||||
// 处理地区选择
|
||||
const handle_location_change = (e: any) => {
|
||||
const [country, province, city] = e;
|
||||
handle_field_edit({ country, province, city });
|
||||
const [province, city, district] = e;
|
||||
handle_field_edit({ province, city, district });
|
||||
};
|
||||
|
||||
// 处理NTRP水平选择
|
||||
@@ -307,8 +312,8 @@ const UserInfoCardComponent: React.FC<UserInfoCardProps> = ({
|
||||
|
||||
// 处理职业选择
|
||||
const handle_occupation_change = (e: any) => {
|
||||
const [country, province, city] = e;
|
||||
handle_field_edit("occupation", `${country} ${province} ${city}`);
|
||||
const [firstVal, secondVal, thirdVal] = e;
|
||||
handle_field_edit("occupation", `${firstVal} ${secondVal} ${thirdVal}`);
|
||||
};
|
||||
const handle_edit_modal_cancel = () => {
|
||||
// 关闭编辑弹窗时显示 GuideBar
|
||||
@@ -565,12 +570,12 @@ const UserInfoCardComponent: React.FC<UserInfoCardProps> = ({
|
||||
<Text>选择职业</Text>
|
||||
</View>
|
||||
) : null}
|
||||
{user_info.country || user_info.province || user_info.city ? (
|
||||
{user_info.province || user_info.city || user_info.district ? (
|
||||
<View
|
||||
className="tag_item"
|
||||
onClick={() => editable && handle_open_edit_modal("location")}
|
||||
>
|
||||
<Text className="tag_text">{`${user_info.province}${user_info.city}`}</Text>
|
||||
<Text className="tag_text">{`${user_info.city}${user_info.district}`}</Text>
|
||||
</View>
|
||||
) : is_current_user ? (
|
||||
<View
|
||||
@@ -665,8 +670,8 @@ const UserInfoCardComponent: React.FC<UserInfoCardProps> = ({
|
||||
visible={location_picker_visible}
|
||||
setvisible={setLocationPickerVisible}
|
||||
value={
|
||||
form_data.country
|
||||
? [form_data.country, form_data.province, form_data.city]
|
||||
form_data.province
|
||||
? [form_data.province, form_data.city, form_data.district]
|
||||
: getDefaultOption(cities)
|
||||
}
|
||||
onChange={handle_location_change}
|
||||
@@ -678,15 +683,12 @@ const UserInfoCardComponent: React.FC<UserInfoCardProps> = ({
|
||||
showHeader={true}
|
||||
title="选择 NTRP 自评水平"
|
||||
ntrpTested={ntrpTested}
|
||||
options={ntrpLevels.map((level) => ({
|
||||
text: level,
|
||||
value: level,
|
||||
}))}
|
||||
options={ntrpLevels}
|
||||
type="ntrp"
|
||||
img={user_info.avatar_url || ""}
|
||||
visible={ntrp_picker_visible}
|
||||
setvisible={setNtrpPickerVisible}
|
||||
value={[form_data.ntrp_level || "2.5"]}
|
||||
value={!form_data.ntrp_level ? ["2.5"] : [form_data.ntrp_level]}
|
||||
onChange={handle_ntrp_level_change}
|
||||
/>
|
||||
)}
|
||||
|
||||
Reference in New Issue
Block a user