Compare commits
1 Commits
2a9e8668a0
...
feat/juguo
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
99c8026f61 |
@@ -67,6 +67,12 @@ const NTRPEvaluatePopup = (props: NTRPEvaluatePopupProps, ref) => {
|
||||
const { updateUserInfo } = useUserActions();
|
||||
const userInfo = useUserInfo();
|
||||
const ntrpLevels = useNtrpLevels();
|
||||
const options = [
|
||||
ntrpLevels.map((item) => ({
|
||||
text: item,
|
||||
value: item,
|
||||
})),
|
||||
];
|
||||
const [evaCallback, setEvaCallback] = useState<EvaluateCallback>({
|
||||
type: "",
|
||||
next: () => {},
|
||||
@@ -165,7 +171,7 @@ const NTRPEvaluatePopup = (props: NTRPEvaluatePopupProps, ref) => {
|
||||
{visible && (
|
||||
<Picker
|
||||
visible
|
||||
options={ntrpLevels}
|
||||
options={options}
|
||||
defaultValue={[ntrp]}
|
||||
onChange={(val) => {
|
||||
console.log(val[0]);
|
||||
|
||||
@@ -3,6 +3,7 @@ import { View, Text, Image } from "@tarojs/components";
|
||||
import Taro from "@tarojs/taro";
|
||||
import { useUserInfo } from "@/store/userStore";
|
||||
import {
|
||||
useEvaluate,
|
||||
EvaluateCallback,
|
||||
EvaluateScene,
|
||||
} from "@/store/evaluateStore";
|
||||
@@ -14,7 +15,6 @@ import styles from "./index.module.scss";
|
||||
import images from "@/config/images";
|
||||
import AiImportPopup from "@/publish_pages/publishBall/components/AiImportPopup";
|
||||
import NTRPEvaluatePopup from "../NTRPEvaluatePopup";
|
||||
import { useDictionaryStore } from "@/store/dictionaryStore";
|
||||
|
||||
export interface PublishMenuProps {
|
||||
onPersonalPublish?: () => void;
|
||||
@@ -30,7 +30,6 @@ const PublishMenu: React.FC<PublishMenuProps> = (props) => {
|
||||
area
|
||||
} = useListState();
|
||||
|
||||
const supportedCitiesList = useDictionaryStore((s) => s.getDictionaryValue('supported_cities')) || [];
|
||||
|
||||
// 使用 useEffect 监听 isVisible 变化,确保所有情况都能触发回调
|
||||
useEffect(() => {
|
||||
@@ -68,10 +67,10 @@ const PublishMenu: React.FC<PublishMenuProps> = (props) => {
|
||||
};
|
||||
const handleMenuItemClick = (type: "individual" | "group" | "ai") => {
|
||||
const [_, address] = area;
|
||||
if (!supportedCitiesList.includes(address)) {
|
||||
if (address !== '上海市') {
|
||||
(Taro as any).showModal({
|
||||
title: '提示',
|
||||
content: '该城市尚未开放,您可加入社群或切换城市',
|
||||
content: '仅上海地区开放,您可加入社群或切换城市',
|
||||
showCancel: false,
|
||||
confirmText: '知道了'
|
||||
})
|
||||
|
||||
@@ -4,11 +4,7 @@ import ListLoadError from "@/components/ListLoadError";
|
||||
import ListCardSkeleton from "@/components/ListCardSkeleton";
|
||||
import { useReachBottom } from "@tarojs/taro";
|
||||
import Taro from "@tarojs/taro";
|
||||
import {
|
||||
useUserInfo,
|
||||
useUserActions,
|
||||
useLastTestResult,
|
||||
} from "@/store/userStore";
|
||||
import { useUserInfo, useUserActions, useLastTestResult } from "@/store/userStore";
|
||||
import { NTRPTestEntryCard } from "@/components";
|
||||
import { EvaluateScene } from "@/store/evaluateStore";
|
||||
import { waitForAuthInit } from "@/utils/authInit";
|
||||
@@ -50,11 +46,7 @@ const ListContainer = (props) => {
|
||||
const { fetchUserInfo, fetchLastTestResult } = useUserActions();
|
||||
// 使用全局状态中的测试结果,避免重复调用接口
|
||||
const lastTestResult = useLastTestResult();
|
||||
const {
|
||||
bannerListImage,
|
||||
bannerDetailImage,
|
||||
bannerListIndex = 0,
|
||||
} = useDictionaryStore((s) => s.bannerDict) || {};
|
||||
const { bannerListImage, bannerDetailImage, bannerListIndex = 0 } = useDictionaryStore((s) => s.bannerDict) || {};
|
||||
useReachBottom(() => {
|
||||
// 加载更多方法
|
||||
if (loading) {
|
||||
@@ -110,7 +102,7 @@ const ListContainer = (props) => {
|
||||
// 先等待静默登录完成
|
||||
await waitForAuthInit();
|
||||
// 然后再获取用户信息
|
||||
const userInfoId = userInfo && "id" in userInfo ? userInfo.id : null;
|
||||
const userInfoId = userInfo && 'id' in userInfo ? userInfo.id : null;
|
||||
if (!userInfoId) {
|
||||
await fetchUserInfo();
|
||||
return; // 等待下一次 useEffect 触发(此时 userInfo.id 已有值)
|
||||
@@ -121,13 +113,7 @@ const ListContainer = (props) => {
|
||||
}
|
||||
};
|
||||
init();
|
||||
}, [
|
||||
evaluateFlag,
|
||||
enableHomeCards,
|
||||
userInfo,
|
||||
lastTestResult,
|
||||
fetchLastTestResult,
|
||||
]);
|
||||
}, [evaluateFlag, enableHomeCards, userInfo, lastTestResult, fetchLastTestResult]);
|
||||
|
||||
// 从全局状态中获取测试状态
|
||||
const hasTestInLastMonth = lastTestResult?.has_test_in_last_month || false;
|
||||
@@ -152,15 +138,13 @@ const ListContainer = (props) => {
|
||||
// 插入 banner 卡片(在 bannerListIndex 位置插入,不替换数据)
|
||||
function insertBannerCard(list) {
|
||||
if (!bannerListImage) return list;
|
||||
if (!list || !Array.isArray(list)) return list ?? [];
|
||||
if (!list || !Array.isArray(list)) {
|
||||
list = [];
|
||||
}
|
||||
const idx = Number(bannerListIndex);
|
||||
return [
|
||||
...list.slice(0, idx),
|
||||
{
|
||||
type: "banner",
|
||||
banner_image_url: bannerListImage,
|
||||
banner_detail_url: bannerDetailImage,
|
||||
},
|
||||
{ type: "banner", banner_image_url: bannerListImage, banner_detail_url: bannerDetailImage },
|
||||
...list.slice(idx),
|
||||
];
|
||||
}
|
||||
@@ -169,9 +153,7 @@ const ListContainer = (props) => {
|
||||
function insertEvaluateCard(list) {
|
||||
if (!list || !Array.isArray(list)) return insertBannerCard(list ?? []);
|
||||
|
||||
const limitedList = shouldLimitByShowNumber
|
||||
? list.slice(0, showNumber)
|
||||
: list;
|
||||
const limitedList = shouldLimitByShowNumber ? list.slice(0, showNumber) : list;
|
||||
|
||||
if (!evaluateFlag || hasTestInLastMonth) {
|
||||
return insertBannerCard(limitedList);
|
||||
@@ -188,16 +170,7 @@ const ListContainer = (props) => {
|
||||
|
||||
const memoizedList = useMemo(
|
||||
() => (enableHomeCards ? insertEvaluateCard(data) : data),
|
||||
[
|
||||
enableHomeCards,
|
||||
evaluateFlag,
|
||||
data,
|
||||
hasTestInLastMonth,
|
||||
showNumber,
|
||||
bannerListImage,
|
||||
bannerDetailImage,
|
||||
bannerListIndex,
|
||||
]
|
||||
[enableHomeCards, evaluateFlag, data, hasTestInLastMonth, showNumber, bannerListImage, bannerDetailImage, bannerListIndex]
|
||||
);
|
||||
|
||||
// 渲染 banner 卡片
|
||||
@@ -212,9 +185,7 @@ const ListContainer = (props) => {
|
||||
const target = item.banner_detail_url;
|
||||
if (target) {
|
||||
(Taro as any).navigateTo({
|
||||
url: `/other_pages/bannerDetail/index?img=${encodeURIComponent(
|
||||
target
|
||||
)}`,
|
||||
url: `/other_pages/bannerDetail/index?img=${encodeURIComponent(target)}`,
|
||||
});
|
||||
}
|
||||
}}
|
||||
@@ -227,14 +198,17 @@ const ListContainer = (props) => {
|
||||
backgroundPosition: "center",
|
||||
backgroundRepeat: "no-repeat",
|
||||
}}
|
||||
></View>
|
||||
>
|
||||
</View>
|
||||
);
|
||||
};
|
||||
|
||||
const showNoData = isShowNoData && !loading && memoizedList?.length === 0;
|
||||
|
||||
// 渲染列表
|
||||
const renderList = () => {
|
||||
// 请求数据为空
|
||||
if (isShowNoData) {
|
||||
if (showNoData) {
|
||||
return (
|
||||
<ListLoadError
|
||||
reload={reload}
|
||||
@@ -259,10 +233,7 @@ const ListContainer = (props) => {
|
||||
}
|
||||
if (enableHomeCards && match?.type === "evaluateCard") {
|
||||
return (
|
||||
<NTRPTestEntryCard
|
||||
key={`evaluate-${index}`}
|
||||
type={EvaluateScene.list}
|
||||
/>
|
||||
<NTRPTestEntryCard key={`evaluate-${index}`} type={EvaluateScene.list} />
|
||||
);
|
||||
}
|
||||
return <ListCard key={match?.id || index} {...match} />;
|
||||
|
||||
@@ -11,8 +11,6 @@ import { EvaluateScene } from "@/store/evaluateStore";
|
||||
import { useUserInfo, useUserActions } from "@/store/userStore";
|
||||
import { usePickerOption } from "@/store/pickerOptionsStore";
|
||||
import { useGlobalState } from "@/store/global";
|
||||
import { useListState } from "@/store/listStore";
|
||||
import { useDictionaryStore } from "@/store/dictionaryStore";
|
||||
|
||||
interface MyselfPageContentProps {
|
||||
isActive?: boolean;
|
||||
@@ -43,10 +41,6 @@ const MyselfPageContent: React.FC<MyselfPageContentProps> = ({
|
||||
const [collapseProfile, setCollapseProfile] = useState(false);
|
||||
const [refreshing, setRefreshing] = useState(false);
|
||||
|
||||
const { area } = useListState();
|
||||
const supportedCitiesList =
|
||||
useDictionaryStore((s) => s.getDictionaryValue("supported_cities")) || [];
|
||||
|
||||
useEffect(() => {
|
||||
pickerOption.getCities();
|
||||
pickerOption.getProfessions();
|
||||
@@ -88,6 +82,7 @@ const MyselfPageContent: React.FC<MyselfPageContentProps> = ({
|
||||
console.log("notEndGames", notEndGames);
|
||||
|
||||
return { notEndGames, finishedGames };
|
||||
|
||||
},
|
||||
[]
|
||||
);
|
||||
@@ -105,6 +100,7 @@ const MyselfPageContent: React.FC<MyselfPageContentProps> = ({
|
||||
games_data = await UserService.get_participated_games(user_info.id);
|
||||
}
|
||||
|
||||
|
||||
const sorted_games = games_data.sort((a, b) => {
|
||||
return (
|
||||
new Date(a.original_start_time.replace(/\s/, "T")).getTime() -
|
||||
@@ -160,16 +156,6 @@ const MyselfPageContent: React.FC<MyselfPageContentProps> = ({
|
||||
};
|
||||
|
||||
const goPublish = () => {
|
||||
const [_, address] = area;
|
||||
if (!supportedCitiesList.includes(address)) {
|
||||
(Taro as any).showModal({
|
||||
title: "提示",
|
||||
content: "该城市尚未开放,您可加入社群或切换城市",
|
||||
showCancel: false,
|
||||
confirmText: "知道了",
|
||||
});
|
||||
return;
|
||||
}
|
||||
(Taro as any).navigateTo({
|
||||
url: "/publish_pages/publishBall/index",
|
||||
});
|
||||
@@ -272,16 +258,14 @@ const MyselfPageContent: React.FC<MyselfPageContentProps> = ({
|
||||
<View className={styles.gameTabsSection}>
|
||||
<View className={styles.tabContainer}>
|
||||
<View
|
||||
className={`${styles.tabItem} ${
|
||||
active_tab === "hosted" ? styles.active : ""
|
||||
className={`${styles.tabItem} ${active_tab === "hosted" ? styles.active : ""
|
||||
}`}
|
||||
onClick={() => setActiveTab("hosted")}
|
||||
>
|
||||
<Text className={styles.tabText}>我主办的</Text>
|
||||
</View>
|
||||
<View
|
||||
className={`${styles.tabItem} ${
|
||||
active_tab === "participated" ? styles.active : ""
|
||||
className={`${styles.tabItem} ${active_tab === "participated" ? styles.active : ""
|
||||
}`}
|
||||
onClick={() => setActiveTab("participated")}
|
||||
>
|
||||
|
||||
@@ -40,9 +40,7 @@
|
||||
border-bottom: 0.5px solid rgba(0, 0, 0, 0.06);
|
||||
padding: 8px 12px;
|
||||
color: #000;
|
||||
font-feature-settings:
|
||||
"liga" off,
|
||||
"clig" off;
|
||||
font-feature-settings: "liga" off, "clig" off;
|
||||
font-family: "PingFang SC";
|
||||
font-size: 14px;
|
||||
font-style: normal;
|
||||
@@ -59,9 +57,7 @@
|
||||
align-items: flex-start;
|
||||
|
||||
color: rgba(60, 60, 67, 0.6);
|
||||
font-feature-settings:
|
||||
"liga" off,
|
||||
"clig" off;
|
||||
font-feature-settings: "liga" off, "clig" off;
|
||||
font-family: "PingFang SC";
|
||||
font-size: 12px;
|
||||
font-style: normal;
|
||||
@@ -121,9 +117,7 @@
|
||||
align-items: center;
|
||||
background: #ff3b30;
|
||||
color: #fff;
|
||||
font-feature-settings:
|
||||
"liga" off,
|
||||
"clig" off;
|
||||
font-feature-settings: "liga" off, "clig" off;
|
||||
font-family: "SF Compact Rounded";
|
||||
font-style: normal;
|
||||
font-weight: 600;
|
||||
@@ -139,9 +133,7 @@
|
||||
box-sizing: border-box;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
font-feature-settings:
|
||||
"liga" off,
|
||||
"clig" off;
|
||||
font-feature-settings: "liga" off, "clig" off;
|
||||
font-family: "SF Compact Rounded";
|
||||
font-size: 22px;
|
||||
font-style: normal;
|
||||
@@ -162,9 +154,7 @@
|
||||
|
||||
.date {
|
||||
color: #000;
|
||||
font-feature-settings:
|
||||
"liga" off,
|
||||
"clig" off;
|
||||
font-feature-settings: "liga" off, "clig" off;
|
||||
font-family: "PingFang SC";
|
||||
font-size: 16px;
|
||||
font-style: normal;
|
||||
@@ -174,9 +164,7 @@
|
||||
|
||||
.venueTime {
|
||||
color: rgba(0, 0, 0, 0.8);
|
||||
font-feature-settings:
|
||||
"liga" off,
|
||||
"clig" off;
|
||||
font-feature-settings: "liga" off, "clig" off;
|
||||
font-family: "PingFang SC";
|
||||
font-size: 12px;
|
||||
font-style: normal;
|
||||
@@ -203,9 +191,7 @@
|
||||
align-items: center;
|
||||
gap: 12px;
|
||||
color: rgba(0, 0, 0, 0.8);
|
||||
font-feature-settings:
|
||||
"liga" off,
|
||||
"clig" off;
|
||||
font-feature-settings: "liga" off, "clig" off;
|
||||
font-family: "PingFang SC";
|
||||
font-size: 12px;
|
||||
font-style: normal;
|
||||
@@ -249,9 +235,7 @@
|
||||
gap: 4px;
|
||||
color: #000;
|
||||
text-align: center;
|
||||
font-feature-settings:
|
||||
"liga" off,
|
||||
"clig" off;
|
||||
font-feature-settings: "liga" off, "clig" off;
|
||||
font-family: "PingFang SC";
|
||||
font-size: 16px;
|
||||
font-style: normal;
|
||||
@@ -267,9 +251,7 @@
|
||||
&Address {
|
||||
color: rgba(0, 0, 0, 0.8);
|
||||
text-align: center;
|
||||
font-feature-settings:
|
||||
"liga" off,
|
||||
"clig" off;
|
||||
font-feature-settings: "liga" off, "clig" off;
|
||||
font-family: "PingFang SC";
|
||||
font-size: 12px;
|
||||
font-style: normal;
|
||||
@@ -288,9 +270,7 @@
|
||||
justify-content: flex-start;
|
||||
gap: 4px;
|
||||
color: var(--Labels-Secondary, rgba(60, 60, 67, 0.6));
|
||||
font-feature-settings:
|
||||
"liga" off,
|
||||
"clig" off;
|
||||
font-feature-settings: "liga" off, "clig" off;
|
||||
font-family: "PingFang SC";
|
||||
font-size: 12px;
|
||||
font-style: normal;
|
||||
@@ -327,9 +307,7 @@
|
||||
|
||||
& > .buttonText {
|
||||
color: #000;
|
||||
font-feature-settings:
|
||||
"liga" off,
|
||||
"clig" off;
|
||||
font-feature-settings: "liga" off, "clig" off;
|
||||
font-family: "PingFang SC";
|
||||
font-size: 12px;
|
||||
font-style: normal;
|
||||
@@ -369,9 +347,7 @@
|
||||
align-items: center;
|
||||
align-self: stretch;
|
||||
color: #000;
|
||||
font-feature-settings:
|
||||
"liga" off,
|
||||
"clig" off;
|
||||
font-feature-settings: "liga" off, "clig" off;
|
||||
font-family: "PingFang SC";
|
||||
font-size: 14px;
|
||||
font-style: normal;
|
||||
@@ -397,9 +373,7 @@
|
||||
width: 120px;
|
||||
display: inline-block;
|
||||
color: rgba(60, 60, 67, 0.6);
|
||||
font-feature-settings:
|
||||
"liga" off,
|
||||
"clig" off;
|
||||
font-feature-settings: "liga" off, "clig" off;
|
||||
font-family: "PingFang SC";
|
||||
font-size: 14px;
|
||||
font-style: normal;
|
||||
@@ -409,9 +383,7 @@
|
||||
|
||||
.content {
|
||||
color: #000;
|
||||
font-feature-settings:
|
||||
"liga" off,
|
||||
"clig" off;
|
||||
font-feature-settings: "liga" off, "clig" off;
|
||||
font-family: "PingFang SC";
|
||||
font-size: 14px;
|
||||
font-style: normal;
|
||||
@@ -428,10 +400,9 @@
|
||||
|
||||
.orderNo {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: flex-end;
|
||||
gap: 0px;
|
||||
justify-content: flex-end;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
|
||||
.copy {
|
||||
color: #007aff;
|
||||
@@ -450,9 +421,7 @@
|
||||
align-items: center;
|
||||
align-self: stretch;
|
||||
color: #000;
|
||||
font-feature-settings:
|
||||
"liga" off,
|
||||
"clig" off;
|
||||
font-feature-settings: "liga" off, "clig" off;
|
||||
font-family: "PingFang SC";
|
||||
font-size: 14px;
|
||||
font-style: normal;
|
||||
@@ -473,9 +442,7 @@
|
||||
align-items: center;
|
||||
color: #000;
|
||||
text-align: center;
|
||||
font-feature-settings:
|
||||
"liga" off,
|
||||
"clig" off;
|
||||
font-feature-settings: "liga" off, "clig" off;
|
||||
font-family: "PingFang SC";
|
||||
font-size: 12px;
|
||||
font-style: normal;
|
||||
@@ -524,9 +491,7 @@
|
||||
&:nth-child(1) {
|
||||
color: #000;
|
||||
text-align: center;
|
||||
font-feature-settings:
|
||||
"liga" off,
|
||||
"clig" off;
|
||||
font-feature-settings: "liga" off, "clig" off;
|
||||
font-family: "PingFang SC";
|
||||
font-size: 14px;
|
||||
font-style: normal;
|
||||
@@ -566,9 +531,7 @@
|
||||
align-items: center;
|
||||
align-self: stretch;
|
||||
color: #000;
|
||||
font-feature-settings:
|
||||
"liga" off,
|
||||
"clig" off;
|
||||
font-feature-settings: "liga" off, "clig" off;
|
||||
font-family: "PingFang SC";
|
||||
font-size: 14px;
|
||||
font-style: normal;
|
||||
@@ -604,9 +567,7 @@
|
||||
background: #000;
|
||||
box-shadow: 0 8px 64px 0 rgba(0, 0, 0, 0.1);
|
||||
backdrop-filter: blur(16px);
|
||||
font-feature-settings:
|
||||
"liga" off,
|
||||
"clig" off;
|
||||
font-feature-settings: "liga" off, "clig" off;
|
||||
font-family: "PingFang SC";
|
||||
font-size: 16px;
|
||||
font-style: normal;
|
||||
@@ -639,9 +600,7 @@
|
||||
text-align: center;
|
||||
// border: 0.5px solid rgba(0, 0, 0, 0.06);
|
||||
color: #000;
|
||||
font-feature-settings:
|
||||
"liga" off,
|
||||
"clig" off;
|
||||
font-feature-settings: "liga" off, "clig" off;
|
||||
font-family: "PingFang SC";
|
||||
font-size: 16px;
|
||||
font-style: normal;
|
||||
@@ -667,9 +626,7 @@
|
||||
padding: 12px 15px;
|
||||
color: rgba(60, 60, 67, 0.6);
|
||||
text-align: center;
|
||||
font-feature-settings:
|
||||
"liga" off,
|
||||
"clig" off;
|
||||
font-feature-settings: "liga" off, "clig" off;
|
||||
font-family: "PingFang SC";
|
||||
font-size: 16px;
|
||||
font-style: normal;
|
||||
|
||||
@@ -230,7 +230,7 @@ const StadiumDetail = forwardRef<StadiumDetailRef, StadiumDetailProps>(({
|
||||
<View className='stadium-item-right'>
|
||||
<View className='stadium-name'>{formData.name}</View>
|
||||
<View className='stadium-address'>
|
||||
<Text>{calculateDistance(formData.istance || null) + ' · '}</Text>
|
||||
<Text>{calculateDistance(formData.istance || null)} · </Text>
|
||||
<Text>{formData.address}</Text>
|
||||
<Image src={images.ICON_ARRORW_SMALL} className='stadium-map-icon' />
|
||||
</View>
|
||||
|
||||
Reference in New Issue
Block a user