146 lines
3.6 KiB
TypeScript
146 lines
3.6 KiB
TypeScript
import React, {
|
|
useState,
|
|
forwardRef,
|
|
useImperativeHandle,
|
|
useRef,
|
|
} from "react";
|
|
import Taro from "@tarojs/taro";
|
|
import { View } from "@tarojs/components";
|
|
import CommonPopup from "../CommonPopup";
|
|
import styles from "./index.module.scss";
|
|
import detailService from "@/services/detailService";
|
|
import { useUserInfo } from "@/store/userStore";
|
|
|
|
const CancelPopup = forwardRef((props, ref) => {
|
|
const [visible, setVisible] = useState(false);
|
|
const onFinish = useRef(null);
|
|
|
|
useImperativeHandle(ref, () => ({
|
|
show: (onAct) => {
|
|
onFinish.current = onAct;
|
|
setVisible(true);
|
|
},
|
|
}));
|
|
|
|
function onClose() {
|
|
setVisible(false);
|
|
}
|
|
return (
|
|
<>
|
|
<CommonPopup
|
|
visible={visible}
|
|
showHeader={false}
|
|
hideFooter
|
|
zIndex={1002}
|
|
enableDragToClose={false}
|
|
onClose={onClose}
|
|
>
|
|
<View className={styles.container}></View>
|
|
</CommonPopup>
|
|
</>
|
|
);
|
|
});
|
|
|
|
export default forwardRef(function GameManagePopup(props, ref) {
|
|
const [visible, setVisible] = useState(false);
|
|
const [detail, setDetail] = useState({});
|
|
const onStatusChange = useRef(null);
|
|
const cancelRef = useRef(null);
|
|
const userInfo = useUserInfo();
|
|
|
|
useImperativeHandle(ref, () => ({
|
|
show: (gameDetail, onChange) => {
|
|
onStatusChange.current = onChange;
|
|
setDetail(gameDetail);
|
|
setVisible(true);
|
|
},
|
|
}));
|
|
|
|
function handleEditGame() {
|
|
Taro.navigateTo({
|
|
url: `/publish_pages/publishBall/index?gameId=${detail.id}`,
|
|
});
|
|
onClose()
|
|
}
|
|
|
|
const handleRepubGame = handleEditGame;
|
|
|
|
async function handleCancelGame() {
|
|
cancelRef.current.show(async (result) => {
|
|
if (result) {
|
|
try {
|
|
const res = await detailService.disbandGame({
|
|
game_id: detail.id,
|
|
settle_reason: result,
|
|
});
|
|
if (res.code === 0) {
|
|
Taro.showToast({ title: "活动取消成功" });
|
|
onStatusChange.current?.(true);
|
|
}
|
|
} catch (e) {
|
|
Taro.showToast({ title: e.message, icon: "error" });
|
|
} finally {
|
|
onClose();
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
async function handleQuitGame() {
|
|
try {
|
|
const res = await detailService.organizerQuit({
|
|
game_id: detail.id,
|
|
quit_reason: "组织者主动退出",
|
|
});
|
|
if (res.code === 0) {
|
|
Taro.showToast({ title: "活动退出成功" });
|
|
onStatusChange.current?.(true);
|
|
}
|
|
} catch (e) {
|
|
Taro.showToast({ title: e.message, icon: "error" });
|
|
} finally {
|
|
onClose();
|
|
}
|
|
}
|
|
|
|
function onClose() {
|
|
setVisible(false);
|
|
}
|
|
|
|
const hasJoin = (detail.participants || []).some(item => item.user.id === userInfo.id)
|
|
|
|
return (
|
|
<>
|
|
<CommonPopup
|
|
visible={visible}
|
|
showHeader={false}
|
|
hideFooter
|
|
zIndex={1001}
|
|
enableDragToClose={false}
|
|
onClose={onClose}
|
|
>
|
|
<View className={styles.container}>
|
|
<View className={styles.button} onClick={handleEditGame}>
|
|
编辑活动
|
|
</View>
|
|
<View className={styles.button} onClick={handleRepubGame}>
|
|
重新发布
|
|
</View>
|
|
<View className={styles.button} onClick={handleCancelGame}>
|
|
取消活动
|
|
</View>
|
|
{hasJoin && (
|
|
<View className={styles.button} onClick={handleQuitGame}>
|
|
退出活动
|
|
</View>
|
|
)}
|
|
<View className={styles.button} onClick={onClose}>
|
|
取消
|
|
</View>
|
|
</View>
|
|
</CommonPopup>
|
|
<CancelPopup ref={cancelRef} />
|
|
</>
|
|
);
|
|
});
|