Commit 7350658f authored by Chunchi Che's avatar Chunchi Che

Merge branch 'optimize/ui/checkcard' into 'main'

Optimize/ui/checkcard

See merge request !161
parents 2ce5bffb 9115bf9e
Pipeline #21068 passed with stages
in 20 minutes and 24 seconds
...@@ -6,7 +6,7 @@ import { ...@@ -6,7 +6,7 @@ import {
} from "@reduxjs/toolkit"; } from "@reduxjs/toolkit";
import { RootState } from "../../../store"; import { RootState } from "../../../store";
import { DuelState } from "../mod"; import { DuelState } from "../mod";
import { findCardByLocation, judgeSelf } from "../util"; import { cmpCardLocation, findCardByLocation, judgeSelf } from "../util";
import { fetchCard, getCardStr } from "../../../api/cards"; import { fetchCard, getCardStr } from "../../../api/cards";
import { ygopro } from "../../../api/ocgcore/idl/ocgcore"; import { ygopro } from "../../../api/ocgcore/idl/ocgcore";
...@@ -65,17 +65,11 @@ export const fetchCheckCardMeta = createAsyncThunk( ...@@ -65,17 +65,11 @@ export const fetchCheckCardMeta = createAsyncThunk(
}) => { }) => {
// FIXME: 这里如果传的`controler`如果是对手,对应的`code`会为零,这时候就无法更新对应的`Meta`信息了,后续需要修复。`fetchCheckCardMetaV2`和`fetchCheckCardMetaV3`同理 // FIXME: 这里如果传的`controler`如果是对手,对应的`code`会为零,这时候就无法更新对应的`Meta`信息了,后续需要修复。`fetchCheckCardMetaV2`和`fetchCheckCardMetaV3`同理
const meta = await fetchCard(param.option.code, true); const meta = await fetchCard(param.option.code, true);
const effectDesc = param.option.effectDescCode
? getCardStr(meta, param.option.effectDescCode & 0xf)
: undefined;
const response = { const response = {
controler: param.option.location.controler,
tagName: param.tagName, tagName: param.tagName,
meta: { option: {
code: meta.id, meta,
name: meta.text.name, location: param.option.location.toObject(),
desc: meta.text.desc,
effectDesc,
}, },
}; };
...@@ -91,6 +85,7 @@ export const checkCardModalCase = ( ...@@ -91,6 +85,7 @@ export const checkCardModalCase = (
const code = action.meta.arg.option.code; const code = action.meta.arg.option.code;
const location = action.meta.arg.option.location; const location = action.meta.arg.option.location;
const controler = location.controler; const controler = location.controler;
const effectDescCode = action.meta.arg.option.effectDescCode;
const response = action.meta.arg.option.response; const response = action.meta.arg.option.response;
const combinedTagName = judgeSelf(controler, state) const combinedTagName = judgeSelf(controler, state)
...@@ -100,24 +95,28 @@ export const checkCardModalCase = ( ...@@ -100,24 +95,28 @@ export const checkCardModalCase = (
const newID = const newID =
code != 0 ? code : findCardByLocation(state, location)?.occupant?.id || 0; code != 0 ? code : findCardByLocation(state, location)?.occupant?.id || 0;
if (newID) { const newOption = {
for (const tag of state.modalState.checkCardModal.tags) { meta: { id: newID, data: {}, text: {} },
if (tag.tagName === combinedTagName) { location: location.toObject(),
tag.options.push({ code: newID, response }); effectDescCode,
return; response,
} };
for (const tag of state.modalState.checkCardModal.tags) {
if (tag.tagName === combinedTagName) {
tag.options.push(newOption);
return;
} }
state.modalState.checkCardModal.tags.push({
tagName: combinedTagName,
options: [{ code: newID, response }],
});
} }
state.modalState.checkCardModal.tags.push({
tagName: combinedTagName,
options: [newOption],
});
}); });
builder.addCase(fetchCheckCardMeta.fulfilled, (state, action) => { builder.addCase(fetchCheckCardMeta.fulfilled, (state, action) => {
const controler = action.payload.controler;
const tagName = action.payload.tagName; const tagName = action.payload.tagName;
const meta = action.payload.meta; const option = action.payload.option;
const controler = option.location.controler!;
const combinedTagName = judgeSelf(controler, state) const combinedTagName = judgeSelf(controler, state)
? `我方的${tagName}` ? `我方的${tagName}`
...@@ -125,11 +124,20 @@ export const checkCardModalCase = ( ...@@ -125,11 +124,20 @@ export const checkCardModalCase = (
for (const tag of state.modalState.checkCardModal.tags) { for (const tag of state.modalState.checkCardModal.tags) {
if (tag.tagName === combinedTagName) { if (tag.tagName === combinedTagName) {
for (const option of tag.options) { for (const old of tag.options) {
if (option.code == meta.code) { if (
option.name = meta.name; option.meta.id == old.meta.id &&
option.desc = meta.desc; cmpCardLocation(option.location, old.location)
option.effectDesc = meta.effectDesc; ) {
const cardID = old.meta.id;
old.meta = option.meta;
old.meta.id = cardID;
const effectDescCode = old.effectDescCode;
const effectDesc = effectDescCode
? getCardStr(old.meta, effectDescCode & 0xf)
: undefined;
old.effectDesc = effectDesc;
} }
} }
} }
......
import { CardMeta } from "../../../api/cards"; import { CardMeta } from "../../../api/cards";
import { ygopro } from "../../../api/ocgcore/idl/ocgcore"; import { ygopro } from "../../../api/ocgcore/idl/ocgcore";
type CardLocation = ReturnType<typeof ygopro.CardLocation.prototype.toObject>;
export interface ModalState { export interface ModalState {
// 卡牌弹窗 // 卡牌弹窗
...@@ -28,9 +29,9 @@ export interface ModalState { ...@@ -28,9 +29,9 @@ export interface ModalState {
tags: { tags: {
tagName: string; tagName: string;
options: { options: {
code: number; meta: CardMeta;
name?: string; location?: CardLocation;
desc?: string; effectDescCode?: number;
effectDesc?: string; effectDesc?: string;
response: number; response: number;
}[]; }[];
......
...@@ -8,6 +8,10 @@ import { Draft } from "@reduxjs/toolkit"; ...@@ -8,6 +8,10 @@ import { Draft } from "@reduxjs/toolkit";
import { ygopro } from "../../api/ocgcore/idl/ocgcore"; import { ygopro } from "../../api/ocgcore/idl/ocgcore";
import { CardState } from "./generic"; import { CardState } from "./generic";
type Location =
| ygopro.CardLocation
| ReturnType<typeof ygopro.CardLocation.prototype.toObject>;
/* /*
* 通过`player`和`selfType`判断是应该处理自己还是对手 * 通过`player`和`selfType`判断是应该处理自己还是对手
* */ * */
...@@ -29,9 +33,7 @@ export function judgeSelf(player: number, state: Draft<DuelState>): boolean { ...@@ -29,9 +33,7 @@ export function judgeSelf(player: number, state: Draft<DuelState>): boolean {
* 通过`controler`,`zone`和`sequence`获取卡牌状态*/ * 通过`controler`,`zone`和`sequence`获取卡牌状态*/
export function findCardByLocation( export function findCardByLocation(
state: Draft<DuelState>, state: Draft<DuelState>,
location: location: Location
| ygopro.CardLocation
| ReturnType<typeof ygopro.CardLocation.prototype.toObject>
): CardState | undefined { ): CardState | undefined {
const controler = location.controler!; const controler = location.controler!;
const zone = location.location; const zone = location.location;
...@@ -73,3 +75,19 @@ export function findCardByLocation( ...@@ -73,3 +75,19 @@ export function findCardByLocation(
} }
} }
} }
export function cmpCardLocation(
left: Location,
right?: Location,
strict?: boolean
): boolean {
if (strict) {
return JSON.stringify(left) === JSON.stringify(right);
} else {
return (
left.controler === right?.controler &&
left.location === right?.location &&
left.sequence === right?.sequence
);
}
}
import React, { useRef, useState } from "react"; import React, { useState } from "react";
import { useAppSelector } from "../../hook"; import { useAppSelector } from "../../hook";
import { store } from "../../store"; import { store } from "../../store";
import { import {
...@@ -14,11 +14,12 @@ import { ...@@ -14,11 +14,12 @@ import {
setCheckCardModalIsOpen, setCheckCardModalIsOpen,
} from "../../reducers/duel/mod"; } from "../../reducers/duel/mod";
import { Button, Row, Col, Popover } from "antd"; import { Button, Row, Col, Popover } from "antd";
import { CheckCard } from "@ant-design/pro-components"; import { CheckCard, CheckCardProps } from "@ant-design/pro-components";
import { import {
sendSelectCardResponse, sendSelectCardResponse,
sendSelectChainResponse, sendSelectChainResponse,
} from "../../api/ocgcore/ocgHelper"; } from "../../api/ocgcore/ocgHelper";
import { ThunderboltOutlined } from "@ant-design/icons";
import NeosConfig from "../../../neos.config.json"; import NeosConfig from "../../../neos.config.json";
import DragModal from "./dragModal"; import DragModal from "./dragModal";
...@@ -32,18 +33,7 @@ const CheckCardModal = () => { ...@@ -32,18 +33,7 @@ const CheckCardModal = () => {
const cancelResponse = useAppSelector(selectCheckCardModalCacnelResponse); const cancelResponse = useAppSelector(selectCheckCardModalCacnelResponse);
const [response, setResponse] = useState<number[]>([]); const [response, setResponse] = useState<number[]>([]);
const defaultValue: number[] = []; const defaultValue: number[] = [];
// Draggable 相关
const [draggable, setDraggable] = useState(false);
const draggleRef = useRef<HTMLDivElement>(null);
const onMouseOver = () => {
if (draggable) {
setDraggable(false);
}
};
const onMouseOut = () => {
setDraggable(true);
};
// TODO: 这里可以考虑更好地封装 // TODO: 这里可以考虑更好地封装
const sendResponseHandler = ( const sendResponseHandler = (
handlerName: string | undefined, handlerName: string | undefined,
...@@ -65,51 +55,43 @@ const CheckCardModal = () => { ...@@ -65,51 +55,43 @@ const CheckCardModal = () => {
return ( return (
<DragModal <DragModal
modalProps={{ title={`请选择${min}到${max}张卡片`}
title: `请选择${min}到${max}张卡片`, open={isOpen}
open: isOpen, closable={false}
closable: false, footer={
footer: ( <>
<> <Button
disabled={response.length < min || response.length > max}
onClick={() => {
sendResponseHandler(onSubmit, response);
dispatch(setCheckCardModalIsOpen(false));
dispatch(resetCheckCardModal());
}}
onFocus={() => {}}
onBlur={() => {}}
>
submit
</Button>
{cancelAble ? (
<Button <Button
disabled={response.length < min || response.length > max}
onClick={() => { onClick={() => {
sendResponseHandler(onSubmit, response); if (cancelResponse) {
sendResponseHandler(onSubmit, [cancelResponse]);
}
dispatch(setCheckCardModalIsOpen(false)); dispatch(setCheckCardModalIsOpen(false));
dispatch(resetCheckCardModal()); dispatch(resetCheckCardModal());
}} }}
onMouseOver={onMouseOver}
onMouseOut={onMouseOut}
onFocus={() => {}} onFocus={() => {}}
onBlur={() => {}} onBlur={() => {}}
> >
submit cancel
</Button> </Button>
{cancelAble ? ( ) : (
<Button <></>
onClick={() => { )}
if (cancelResponse) { </>
sendResponseHandler(onSubmit, [cancelResponse]); }
} width={800}
dispatch(setCheckCardModalIsOpen(false));
dispatch(resetCheckCardModal());
}}
onMouseOver={onMouseOver}
onMouseOut={onMouseOut}
onFocus={() => {}}
onBlur={() => {}}
>
cancel
</Button>
) : (
<></>
)}
</>
),
width: 800,
}}
dragRef={draggleRef}
draggable={draggable}
> >
<CheckCard.Group <CheckCard.Group
multiple multiple
...@@ -127,30 +109,24 @@ const CheckCardModal = () => { ...@@ -127,30 +109,24 @@ const CheckCardModal = () => {
{tab.options.map((option, idx) => { {tab.options.map((option, idx) => {
return ( return (
<Col span={4} key={idx}> <Col span={4} key={idx}>
<Popover <HoverCheckCard
content={ hoverContent={option.effectDesc}
<div> title={option.meta.text.name}
<p>{option.name}</p> description={option.meta.text.desc}
<p>{option.effectDesc}</p> style={{ width: 120 }}
</div> cover={
<img
alt={option.meta.id.toString()}
src={
option.meta.id
? `${NeosConfig.cardImgUrl}/${option.meta.id}.jpg`
: `${NeosConfig.assetsPath}/card_back.jpg`
}
style={{ width: 100 }}
/>
} }
> value={option.response}
<CheckCard />
title={option.name}
description={option.desc}
style={{ width: 120 }}
cover={
<img
alt={option.code.toString()}
src={`${NeosConfig.cardImgUrl}/${option.code}.jpg`}
style={{ width: 100 }}
/>
}
onMouseEnter={onMouseOver}
onMouseLeave={onMouseOut}
value={option.response}
/>
</Popover>
</Col> </Col>
); );
})} })}
...@@ -162,4 +138,28 @@ const CheckCardModal = () => { ...@@ -162,4 +138,28 @@ const CheckCardModal = () => {
); );
}; };
const HoverCheckCard = (props: CheckCardProps & { hoverContent?: string }) => {
const [hover, setHover] = useState(false);
const onMouseEnter = () => setHover(true);
const onMouseLeave = () => setHover(false);
return (
<>
<CheckCard {...props} />
{props.hoverContent ? (
<Popover content={<p>{props.hoverContent}</p>} open={hover}>
<Button
icon={<ThunderboltOutlined />}
onMouseEnter={onMouseEnter}
onMouseLeave={onMouseLeave}
></Button>
</Popover>
) : (
<></>
)}
</>
);
};
export default CheckCardModal; export default CheckCardModal;
import React, { useRef, useState } from "react"; import React from "react";
import { useAppSelector } from "../../hook"; import { useAppSelector } from "../../hook";
import { store } from "../../store"; import { store } from "../../store";
import { Button, Card, Row, Col } from "antd"; import { Button, Card, Row, Col } from "antd";
...@@ -32,18 +32,7 @@ const CheckCardModalV2 = () => { ...@@ -32,18 +32,7 @@ const CheckCardModalV2 = () => {
); );
const selectedOptions = useAppSelector(selectCheckCardModalV2SelectedOptions); const selectedOptions = useAppSelector(selectCheckCardModalV2SelectedOptions);
const responseable = useAppSelector(selectCheckCardModalV2ResponseAble); const responseable = useAppSelector(selectCheckCardModalV2ResponseAble);
// Draggable 相关
const [draggable, setDraggable] = useState(false);
const draggleRef = useRef<HTMLDivElement>(null);
const onMouseOver = () => {
if (draggable) {
setDraggable(false);
}
};
const onMouseOut = () => {
setDraggable(true);
};
const onFinish = () => { const onFinish = () => {
sendSelectUnselectCardResponse({ cancel_or_finish: true }); sendSelectUnselectCardResponse({ cancel_or_finish: true });
dispatch(setCheckCardModalV2IsOpen(false)); dispatch(setCheckCardModalV2IsOpen(false));
...@@ -57,34 +46,20 @@ const CheckCardModalV2 = () => { ...@@ -57,34 +46,20 @@ const CheckCardModalV2 = () => {
return ( return (
<DragModal <DragModal
modalProps={{ title={`请选择未选择的卡片,最少${min}张,最多${max}张`}
title: `请选择未选择的卡片,最少${min}张,最多${max}张`, open={isOpen}
open: isOpen, closable={false}
closable: false, footer={
footer: ( <>
<> <Button disabled={!finishable || !responseable} onClick={onFinish}>
<Button finish
disabled={!finishable || !responseable} </Button>
onClick={onFinish} <Button disabled={!cancelable || !responseable} onClick={onCancel}>
onMouseOver={onMouseOver} cancel
onMouseOut={onMouseOut} </Button>
> </>
finish }
</Button> width={800}
<Button
disabled={!cancelable || !responseable}
onClick={onCancel}
onMouseOver={onMouseOver}
onMouseOut={onMouseOut}
>
cancel
</Button>
</>
),
width: 800,
}}
dragRef={draggleRef}
draggable={draggable}
> >
<CheckCard.Group <CheckCard.Group
bordered bordered
...@@ -114,8 +89,6 @@ const CheckCardModalV2 = () => { ...@@ -114,8 +89,6 @@ const CheckCardModalV2 = () => {
/> />
} }
value={option.response} value={option.response}
onMouseEnter={onMouseOver}
onMouseLeave={onMouseOut}
/> />
</Col> </Col>
); );
......
import React, { useRef, useState } from "react"; import React, { useState } from "react";
import { useAppSelector } from "../../hook"; import { useAppSelector } from "../../hook";
import { store } from "../../store"; import { store } from "../../store";
import { Button, Card, Row, Col } from "antd"; import { Button, Card, Row, Col } from "antd";
...@@ -32,18 +32,7 @@ const CheckCardModalV3 = () => { ...@@ -32,18 +32,7 @@ const CheckCardModalV3 = () => {
.concat(selectedOptions) .concat(selectedOptions)
.map((option) => option.level2) .map((option) => option.level2)
.reduce((sum, current) => sum + current, 0); .reduce((sum, current) => sum + current, 0);
// Draggable 相关
const [draggable, setDraggable] = useState(false);
const draggleRef = useRef<HTMLDivElement>(null);
const onMouseOver = () => {
if (draggable) {
setDraggable(false);
}
};
const onMouseOut = () => {
setDraggable(true);
};
const responseable = const responseable =
(overflow (overflow
? Level1Sum >= LevelSum || Level2Sum >= LevelSum ? Level1Sum >= LevelSum || Level2Sum >= LevelSum
...@@ -61,26 +50,17 @@ const CheckCardModalV3 = () => { ...@@ -61,26 +50,17 @@ const CheckCardModalV3 = () => {
return ( return (
<DragModal <DragModal
modalProps={{ title={`请选择卡片,最少${min}张,最多${max}张`}
title: `请选择卡片,最少${min}张,最多${max}张`, open={isOpen}
open: isOpen, closable={false}
closable: false, footer={
footer: ( <>
<> <Button disabled={!responseable} onClick={onFinish}>
<Button finish
disabled={!responseable} </Button>
onClick={onFinish} </>
onMouseOver={onMouseOver} }
onMouseOut={onMouseOut} width={800}
>
finish
</Button>
</>
),
width: 800,
}}
dragRef={draggleRef}
draggable={draggable}
> >
<CheckCard.Group <CheckCard.Group
bordered bordered
...@@ -107,8 +87,6 @@ const CheckCardModalV3 = () => { ...@@ -107,8 +87,6 @@ const CheckCardModalV3 = () => {
/> />
} }
value={option} value={option}
onMouseEnter={onMouseOver}
onMouseLeave={onMouseOut}
/> />
</Col> </Col>
); );
......
import { Button, Row, Col, Card, InputNumber } from "antd"; import { Button, Row, Col, Card, InputNumber } from "antd";
import React, { useRef, useState } from "react"; import React, { useState } from "react";
import { sendSelectCounterResponse } from "../../api/ocgcore/ocgHelper"; import { sendSelectCounterResponse } from "../../api/ocgcore/ocgHelper";
import { fetchStrings } from "../../api/strings"; import { fetchStrings } from "../../api/strings";
import { useAppSelector } from "../../hook"; import { useAppSelector } from "../../hook";
...@@ -19,7 +19,6 @@ const CheckCounterModal = () => { ...@@ -19,7 +19,6 @@ const CheckCounterModal = () => {
const [selected, setSelected] = useState(new Array(options.length)); const [selected, setSelected] = useState(new Array(options.length));
const sum = selected.reduce((sum, current) => sum + current, 0); const sum = selected.reduce((sum, current) => sum + current, 0);
const finishable = sum == min; const finishable = sum == min;
const draggleRef = useRef<HTMLDivElement>(null);
const onFinish = () => { const onFinish = () => {
sendSelectCounterResponse(selected); sendSelectCounterResponse(selected);
...@@ -28,18 +27,14 @@ const CheckCounterModal = () => { ...@@ -28,18 +27,14 @@ const CheckCounterModal = () => {
return ( return (
<DragModal <DragModal
modalProps={{ title={`请移除${min}个${counterName}`}
title: `请移除${min}个${counterName}`, open={isOpen}
open: isOpen, closable={false}
closable: false, footer={
footer: ( <Button disabled={!finishable} onClick={onFinish}>
<Button disabled={!finishable} onClick={onFinish}> finish
finish </Button>
</Button> }
),
}}
dragRef={draggleRef}
draggable={true}
> >
<Row> <Row>
{options.map((option, idx) => { {options.map((option, idx) => {
......
// 经过封装的可拖拽`Modal` // 经过封装的可拖拽`Modal`
import React, { useState } from "react"; import React, { useRef, useState } from "react";
import type { DraggableData, DraggableEvent } from "react-draggable"; import type { DraggableData, DraggableEvent } from "react-draggable";
import Draggable from "react-draggable"; import Draggable from "react-draggable";
import { Modal, ModalProps } from "antd"; import { Modal, ModalProps } from "antd";
export interface DragModalProps { export interface DragModalProps extends ModalProps {}
modalProps: ModalProps;
dragRef: React.RefObject<HTMLDivElement>;
draggable: boolean;
children?: React.ReactNode;
}
const DragModal = (props: DragModalProps) => { const DragModal = (props: DragModalProps) => {
const dragRef = useRef<HTMLDivElement>(null);
const [bounds, setBounds] = useState({ const [bounds, setBounds] = useState({
left: 0, left: 0,
top: 0, top: 0,
...@@ -20,7 +16,7 @@ const DragModal = (props: DragModalProps) => { ...@@ -20,7 +16,7 @@ const DragModal = (props: DragModalProps) => {
}); });
const onStart = (_event: DraggableEvent, uiData: DraggableData) => { const onStart = (_event: DraggableEvent, uiData: DraggableData) => {
const { clientWidth, clientHeight } = window.document.documentElement; const { clientWidth, clientHeight } = window.document.documentElement;
const targetRect = props.dragRef.current?.getBoundingClientRect(); const targetRect = dragRef.current?.getBoundingClientRect();
if (!targetRect) { if (!targetRect) {
return; return;
} }
...@@ -34,14 +30,10 @@ const DragModal = (props: DragModalProps) => { ...@@ -34,14 +30,10 @@ const DragModal = (props: DragModalProps) => {
return ( return (
<Modal <Modal
{...props.modalProps} {...props}
modalRender={(modal) => ( modalRender={(modal) => (
<Draggable <Draggable bounds={bounds} onStart={onStart}>
disabled={!props.draggable} <div ref={dragRef}>{modal}</div>
bounds={bounds}
onStart={onStart}
>
<div ref={props.dragRef}>{modal}</div>
</Draggable> </Draggable>
)} )}
> >
......
import React, { useRef, useState } from "react"; import React, { useState } from "react";
import { useAppSelector } from "../../hook"; import { useAppSelector } from "../../hook";
import { store } from "../../store"; import { store } from "../../store";
import { Button } from "antd"; import { Button } from "antd";
...@@ -19,31 +19,26 @@ const OptionModal = () => { ...@@ -19,31 +19,26 @@ const OptionModal = () => {
const isOpen = useAppSelector(selectOptionModalIsOpen); const isOpen = useAppSelector(selectOptionModalIsOpen);
const options = useAppSelector(selectOptionModalOptions); const options = useAppSelector(selectOptionModalOptions);
const [selected, setSelected] = useState<number | undefined>(undefined); const [selected, setSelected] = useState<number | undefined>(undefined);
const draggleRef = useRef<HTMLDivElement>(null);
return ( return (
<DragModal <DragModal
modalProps={{ title="请选择需要发动的效果"
title: "请选择需要发动的效果", open={isOpen}
open: isOpen, closable={false}
closable: false, footer={
footer: ( <Button
<Button disabled={selected === undefined}
disabled={selected === undefined} onClick={() => {
onClick={() => { if (selected !== undefined) {
if (selected !== undefined) { sendSelectOptionResponse(selected);
sendSelectOptionResponse(selected); dispatch(setOptionModalIsOpen(false));
dispatch(setOptionModalIsOpen(false)); dispatch(resetOptionModal());
dispatch(resetOptionModal()); }
} }}
}} >
> submit
submit </Button>
</Button> }
),
}}
dragRef={draggleRef}
draggable={true}
> >
<CheckCard.Group <CheckCard.Group
bordered bordered
......
import React, { useRef, useState } from "react"; import React, { useState } from "react";
import { useAppSelector } from "../../hook"; import { useAppSelector } from "../../hook";
import { store } from "../../store"; import { store } from "../../store";
import { Button } from "antd"; import { Button } from "antd";
...@@ -22,31 +22,26 @@ const PositionModal = () => { ...@@ -22,31 +22,26 @@ const PositionModal = () => {
const [selected, setSelected] = useState<ygopro.CardPosition | undefined>( const [selected, setSelected] = useState<ygopro.CardPosition | undefined>(
undefined undefined
); );
const draggleRef = useRef<HTMLDivElement>(null);
return ( return (
<DragModal <DragModal
modalProps={{ title="请选择表示形式"
title: "请选择表示形式", open={isOpen}
open: isOpen, closable={false}
closable: false, footer={
footer: ( <Button
<Button disabled={selected === undefined}
disabled={selected === undefined} onClick={() => {
onClick={() => { if (selected !== undefined) {
if (selected !== undefined) { sendSelectPositionResponse(selected);
sendSelectPositionResponse(selected); dispatch(setPositionModalIsOpen(false));
dispatch(setPositionModalIsOpen(false)); dispatch(resetPositionModal());
dispatch(resetPositionModal()); }
} }}
}} >
> submit
submit </Button>
</Button> }
),
}}
dragRef={draggleRef}
draggable={true}
> >
<CheckCard.Group <CheckCard.Group
bordered bordered
......
import React, { useEffect, useRef, useState } from "react"; import React, { useEffect, useState } from "react";
import { import {
DndContext, DndContext,
closestCenter, closestCenter,
...@@ -21,8 +21,7 @@ import { selectSortCardModal } from "../../reducers/duel/modal/sortCardModalSlic ...@@ -21,8 +21,7 @@ import { selectSortCardModal } from "../../reducers/duel/modal/sortCardModalSlic
import { sendSortCardResponse } from "../../api/ocgcore/ocgHelper"; import { sendSortCardResponse } from "../../api/ocgcore/ocgHelper";
import { store } from "../../store"; import { store } from "../../store";
import { resetSortCardModal } from "../../reducers/duel/mod"; import { resetSortCardModal } from "../../reducers/duel/mod";
import DragModal from "./dragModal"; import { Modal, Button, Card } from "antd";
import { Button, Card } from "antd";
import { CardMeta } from "../../api/cards"; import { CardMeta } from "../../api/cards";
import NeosConfig from "../../../neos.config.json"; import NeosConfig from "../../../neos.config.json";
...@@ -38,7 +37,6 @@ const SortCardModal = () => { ...@@ -38,7 +37,6 @@ const SortCardModal = () => {
coordinateGetter: sortableKeyboardCoordinates, coordinateGetter: sortableKeyboardCoordinates,
}) })
); );
const draggleRef = useRef<HTMLDivElement>(null);
const onFinish = () => { const onFinish = () => {
sendSortCardResponse(items.map((item) => item.response)); sendSortCardResponse(items.map((item) => item.response));
...@@ -62,15 +60,11 @@ const SortCardModal = () => { ...@@ -62,15 +60,11 @@ const SortCardModal = () => {
}, [options]); }, [options]);
return ( return (
<DragModal <Modal
modalProps={{ title="请为下列卡牌排序"
title: "请为下列卡牌排序", open={isOpen}
open: isOpen, closable={false}
closable: false, footer={<Button onClick={onFinish}>finish</Button>}
footer: <Button onClick={onFinish}>finish</Button>,
}}
dragRef={draggleRef}
draggable={false}
> >
<DndContext <DndContext
sensors={sensors} sensors={sensors}
...@@ -90,7 +84,7 @@ const SortCardModal = () => { ...@@ -90,7 +84,7 @@ const SortCardModal = () => {
))} ))}
</SortableContext> </SortableContext>
</DndContext> </DndContext>
</DragModal> </Modal>
); );
}; };
......
...@@ -8,7 +8,6 @@ import { ...@@ -8,7 +8,6 @@ import {
selectMeInitInfo, selectMeInitInfo,
selectOpInitInfo, selectOpInitInfo,
} from "../../reducers/duel/initInfoSlice"; } from "../../reducers/duel/initInfoSlice";
import { selectCurrentPlayerIsMe } from "../../reducers/duel/turnSlice";
import { selectWaiting } from "../../reducers/duel/mod"; import { selectWaiting } from "../../reducers/duel/mod";
const Config = NeosConfig.ui.status; const Config = NeosConfig.ui.status;
......
import React, { useRef } from "react"; import React from "react";
import { useAppSelector } from "../../hook"; import { useAppSelector } from "../../hook";
import { store } from "../../store"; import { store } from "../../store";
import { Button } from "antd"; import { Button } from "antd";
...@@ -14,38 +14,32 @@ const YesNoModal = () => { ...@@ -14,38 +14,32 @@ const YesNoModal = () => {
const dispatch = store.dispatch; const dispatch = store.dispatch;
const isOpen = useAppSelector(selectYesNoModalIsOpen); const isOpen = useAppSelector(selectYesNoModalIsOpen);
const msg = useAppSelector(selectYesNOModalMsg); const msg = useAppSelector(selectYesNOModalMsg);
// Draggable 相关
const draggleRef = useRef<HTMLDivElement>(null);
return ( return (
<DragModal <DragModal
modalProps={{ title={msg}
title: msg, open={isOpen}
open: isOpen, closable={false}
closable: false, footer={
footer: ( <>
<> <Button
<Button onClick={() => {
onClick={() => { sendSelectEffectYnResponse(true);
sendSelectEffectYnResponse(true); dispatch(setYesNoModalIsOpen(false));
dispatch(setYesNoModalIsOpen(false)); }}
}} >
> Yes
Yes </Button>
</Button> <Button
<Button onClick={() => {
onClick={() => { sendSelectEffectYnResponse(false);
sendSelectEffectYnResponse(false); dispatch(setYesNoModalIsOpen(false));
dispatch(setYesNoModalIsOpen(false)); }}
}} >
> No
No </Button>
</Button> </>
</> }
),
}}
dragRef={draggleRef}
draggable={true}
/> />
); );
}; };
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment