fix: 问题修复

This commit is contained in:
2025-11-15 19:08:19 +08:00
parent 93f08d5a9f
commit 79b2e9869f
24 changed files with 872 additions and 529 deletions

View File

@@ -204,6 +204,9 @@ export default function GameInfo(props) {
// hide business msg
showLocation
theme="dark"
enableScroll={false}
enableZoom={false}
onTap={openMap}
/>
)}
</View>

View File

@@ -1,5 +1,5 @@
import { View, Text } from "@tarojs/components";
import { genNTRPRequirementText } from "../../utils/helper";
import { genNTRPRequirementText } from "@/utils/helper";
import styles from "./index.module.scss";
// 玩法要求

View File

@@ -6,7 +6,7 @@ import { calculateDistance } from "@/utils";
import { useUserInfo } from "@/store/userStore";
import * as LoginService from "@/services/loginService";
import img from "@/config/images";
import { navto } from "../../utils/helper";
import { navto } from "@/utils/helper";
import styles from "./index.module.scss";
function genRecommendGames(games, location, avatar) {

View File

@@ -12,7 +12,7 @@ import WechatLogo from "@/static/detail/wechat_icon.svg";
// import WechatTimeline from "@/static/detail/wechat_timeline.svg";
import LinkIcon from "@/static/detail/link.svg";
import CrossIcon from "@/static/detail/cross.svg";
import { genNTRPRequirementText, navto } from "../../utils/helper";
import { genNTRPRequirementText, navto } from "@/utils/helper";
import { DayOfWeekMap } from "../../config";
import styles from "./index.module.scss";

View File

@@ -88,7 +88,7 @@
&.disabled > .sticky-bottom-bar-join-game {
background: #b4b4b4;
color: rgba(60, 60, 67, 0.6);
pointer-events: none;
// pointer-events: none;
}
.sticky-bottom-bar-join-game {
@@ -147,6 +147,7 @@
font-feature-settings: "liga" off, "clig" off;
font-family: "DingTalk JinBuTi";
// font-style: italic;
font-style: normal;
font-size: 18px;
font-weight: 400;
line-height: 20px;

View File

@@ -9,7 +9,7 @@ import { MATCH_STATUS, IsSubstituteSupported } from "@/services/detailService";
import { GameManagePopup, NTRPEvaluatePopup } from "@/components";
import img from "@/config/images";
import RMB_ICON from "@/static/detail/rmb.svg";
import { toast, navto } from "../../utils/helper";
import { toast, navto } from "@/utils/helper";
import styles from "./index.module.scss";
function isFull(counts) {
@@ -36,6 +36,34 @@ function isFull(counts) {
return false;
}
function matchNtrpRequestment(
target?: string,
min?: string,
max?: string
): boolean {
// 目标值为空或 undefined
if (!target?.trim()) return true;
// 提取目标值中的第一个数字
const match = target.match(/-?\d+(\.\d+)?/);
if (!match) return true;
const value = parseFloat(match[0]);
const minNum = min !== undefined ? parseFloat(min) : undefined;
const maxNum = max !== undefined ? parseFloat(max) : undefined;
// min 和 max 都未定义 → 直接通过
if (minNum === undefined && maxNum === undefined) return true;
// min = max 或只有一边 undefined → 参考值判断,包含端点
if (minNum === undefined || maxNum === undefined || minNum === maxNum) {
return value >= (minNum ?? maxNum!);
}
// 正常区间判断,包含端点
return value >= minNum && value <= maxNum;
}
// 底部操作栏
export default function StickyButton(props) {
const {
@@ -45,6 +73,7 @@ export default function StickyButton(props) {
onStatusChange,
handleAddComment,
getCommentCount,
currentUserInfo,
} = props;
const [commentCount, setCommentCount] = useState(0);
const ntrpRef = useRef<{
@@ -58,14 +87,28 @@ export default function StickyButton(props) {
start_time,
end_time,
is_organizer,
skill_level_max,
skill_level_min,
} = detail || {};
const { ntrp_level } = currentUserInfo || {};
const matchNtrpReq = matchNtrpRequestment(
ntrp_level,
skill_level_min,
skill_level_max
);
const gameManageRef = useRef();
function handleSelfEvaluate() {
ntrpRef?.current?.show({
type: EvaluateScene.detail,
next: (flag) => {
next: ({ flag, score }) => {
if (!matchNtrpRequestment(score, skill_level_min, skill_level_max)) {
toast("您当前不符合此球局NTRP水平要求去看看其他活动吧");
return;
}
if (flag) {
Taro.navigateTo({
url: `/order_pages/orderDetail/index?gameId=${id}`,
@@ -123,31 +166,31 @@ export default function StickyButton(props) {
return {
text: "活动已取消",
available: false,
// action: () => toast("活动已取消"),
action: () => toast("活动已取消,去看看其他活动吧~"),
};
} else if (MATCH_STATUS.FINISHED === match_status) {
return {
text: "活动已结束",
available: false,
// action: () => toast("活动已取消"),
action: () => toast("活动已结束,去看看其他活动吧~"),
};
} else if (dayjs(end_time).isBefore(dayjs())) {
return {
text: "活动已结束",
available: false,
// action: () => toast("活动已结束"),
action: () => toast("活动已结束,去看看其他活动吧~"),
};
} else if (dayjs(start_time).isBefore(dayjs())) {
return {
text: "活动已开始",
available: false,
// action: () => toast("活动已开始"),
action: () => toast("活动已开始,去看看其他活动吧~"),
};
} else if (isFull(detail)) {
return {
text: "活动已满员",
available: false,
// action: () => toast("活动已满员"),
action: () => toast("活动已满员,去看看其他活动吧~"),
};
}
if (waiting_start) {
@@ -159,7 +202,7 @@ export default function StickyButton(props) {
<Text className={styles.btnText}></Text>
</>
),
action: () => toast("已加入"),
action: () => toast("您已参与了本次活动"),
};
} else if (is_substituting) {
return {
@@ -170,7 +213,7 @@ export default function StickyButton(props) {
<Text className={styles.btnText}></Text>
</>
),
action: () => toast("已加入候补"),
action: () => toast("已加入候补,候补失败会全额退款~"),
};
} else if (can_pay) {
return {
@@ -190,6 +233,19 @@ export default function StickyButton(props) {
}
},
};
} else if (!matchNtrpReq) {
return {
text: () => (
<>
<Image className={styles.crrrencySymbol} src={RMB_ICON} />
{displayPrice}
<Text className={styles.btnText}></Text>
</>
),
available: false,
action: () =>
toast("您当前不符合此球局NTRP水平要求去看看其他活动吧"),
};
} else if (can_substitute) {
return {
text: () => (

View File

@@ -1,6 +1,6 @@
import { Text, View } from "@tarojs/components";
import styles from "./index.module.scss";
import { insertDotInTags } from "../../utils/helper";
import { insertDotInTags } from "@/utils/helper";
export default function SupplementalNotes(props) {
const {

View File

@@ -4,7 +4,7 @@ import Taro from "@tarojs/taro";
import { CommonPopup } from "@/components";
import img from "@/config/images";
import styles from "./index.module.scss";
import { insertDotInTags } from "../../utils/helper";
import { insertDotInTags } from "@/utils/helper";
// 场馆信息
export default function VenueInfo(props) {

View File

@@ -1,8 +1,7 @@
.detail-page {
width: 100%;
height: 100%;
// background-color: #FAFAFA;
// padding-bottom: env(safe-area-inset-bottom);
position: relative;
.custom-navbar {
height: 56px; /* 通常与原生导航栏高度一致 */
@@ -11,43 +10,55 @@
justify-content: center;
// background-color: #fff;
color: #000;
padding-top: 44px; /* 适配状态栏 */
position: sticky;
// padding-top: 44px; /* 适配状态栏 */
position: fixed;
width: 100%;
top: 0;
box-sizing: border-box;
z-index: 100;
overflow: hidden;
background-color: rgba(0, 0, 0, 0.2);
border-bottom: 1px solid transparent;
transition: background 0.25s ease, backdrop-filter 0.25s ease;
&.glass {
background: rgba(0, 0, 0, 0.2);
box-shadow: 0 0 4px 0 rgba(255, 255, 255, 0.25) inset;
backdrop-filter: blur(6px);
border-color: rgba(0, 0, 0, 0.1);
}
}
.detail-navigator {
height: 30px;
height: 40px;
width: 80px;
border-radius: 15px;
position: absolute;
left: 12px;
border: 1px solid #888;
// border: 1px solid #888;
box-sizing: border-box;
color: #fff;
display: flex;
align-items: center;
background: rgba(0, 0, 0, 0.1);
// background: rgba(0, 0, 0, 0.1);
.detail-navigator-back {
border-right: 1px solid #444;
}
// .detail-navigator-back {
// border-right: 1px solid #444;
// }
.detail-navigator-back,
.detail-navigator-icon {
height: 20px;
width: 50%;
height: 100%;
width: 100%;
display: flex;
justify-content: center;
justify-content: flex-start;
align-items: center;
& > .detail-navigator-back-icon {
width: 20px;
height: 20px;
width: 16px;
height: 16px;
color: #fff;
margin-left: 8px;
}
& > .detail-navigator-logo-icon {

View File

@@ -1,6 +1,8 @@
import { useState, useEffect, useRef } from "react";
import { View, Text, Image } from "@tarojs/components";
import { View, Text, Image, ScrollView } from "@tarojs/components";
import Taro, { useRouter, useDidShow } from "@tarojs/taro";
import classnames from "classnames";
import { throttle } from "@tarojs/runtime";
// 导入API服务
import { withAuth, Comments } from "@/components";
import DetailService from "@/services/detailService";
@@ -18,9 +20,9 @@ import Participants from "./components/Participants";
import SupplementalNotes from "./components/SupplementalNotes";
import OrganizerInfo from "./components/OrganizerInfo";
import SharePopup from "./components/SharePopup";
import { navto, toast } from "./utils/helper";
import { navto, toast } from "@/utils/helper";
import ArrowLeft from "@/static/detail/icon-arrow-left.svg";
import Logo from "@/static/detail/icon-logo-go.svg";
// import Logo from "@/static/detail/icon-logo-go.svg";
import styles from "./index.module.scss";
function Index() {
@@ -35,7 +37,7 @@ function Index() {
const myInfo = useUserInfo();
const { statusNavbarHeightInfo } = useGlobalState();
const { statusBarHeight, navBarHeight } = statusNavbarHeightInfo;
const { statusBarHeight, navBarHeight, totalHeight } = statusNavbarHeightInfo;
const isMyOwn = userInfo.id === myInfo.id;
@@ -150,14 +152,33 @@ function Index() {
? { backgroundImage: `url(${detail?.image_list?.[0]})` }
: {};
const [glass, setGlass] = useState(false);
const onScroll = throttle((e) => {
const top = e.detail.scrollTop;
setGlass(top > 20);
}, 16);
return (
<View className={styles["detail-page"]}>
<ScrollView
className={styles["detail-page"]}
scrollY
onScroll={onScroll}
onScrollToUpper={() => {
setGlass(false);
}}
enhanced
showScrollbar={false}
>
{/* custom navbar */}
<view
className={styles["custom-navbar"]}
<View
className={classnames(
styles["custom-navbar"],
glass ? styles.glass : ""
)}
style={{
height: `${statusBarHeight}px`,
paddingTop: `${navBarHeight}px`,
height: `${totalHeight}px`,
paddingTop: `${statusBarHeight}px`,
}}
>
<View className={styles["detail-navigator"]}>
@@ -170,14 +191,14 @@ function Index() {
src={ArrowLeft}
/>
</View>
<View className={styles["detail-navigator-icon"]}>
{/* <View className={styles["detail-navigator-icon"]}>
<Image
className={styles["detail-navigator-logo-icon"]}
src={Logo}
/>
</View>
</View> */}
</View>
</view>
</View>
<View className={styles["detail-page-bg"]} style={backgroundImage} />
{/* swiper */}
<Carousel detail={detail} />
@@ -238,6 +259,7 @@ function Index() {
getCommentCount={
commentRef.current && commentRef.current.getCommentCount
}
currentUserInfo={myInfo}
/>
{/* share popup */}
<SharePopup
@@ -248,7 +270,7 @@ function Index() {
userInfo={userInfo}
/>
</View>
</View>
</ScrollView>
);
}

View File

@@ -1,28 +0,0 @@
import Taro from "@tarojs/taro";
export function navto(url) {
Taro.navigateTo({
url: url,
});
}
export function toast(message) {
Taro.showToast({ title: message, icon: "none" });
}
// 将·作为连接符插入到标签文本之间
export function insertDotInTags(tags: string[]) {
if (!tags) return [];
return tags.join("-·-").split("-");
}
export function genNTRPRequirementText(min, max) {
if (min && max && min !== max) {
return `${min} - ${max} 之间`;
} else if (max === "1") {
return "无要求";
} else if (max) {
return `${max} 以上`;
}
return "-";
}

View File

@@ -13,7 +13,7 @@ import WechatLogo from "@/static/detail/wechat_icon.svg";
import WechatTimeline from "@/static/detail/wechat_timeline.svg";
import { useUserActions } from "@/store/userStore";
import { DayOfWeekMap } from "../detail/config";
import { genNTRPRequirementText } from "@/game_pages/detail/utils/helper";
import { genNTRPRequirementText } from "@/utils/helper";
import styles from "./index.module.scss";
function SharePoster(props) {