map3d/src/ui/App.tsx

238 lines
6.3 KiB
TypeScript

import { css } from "@emotion/react";
import { ExportButton, Space } from "../three/Space";
import { FullscreenModal } from "../components/FullscreenModal";
import { Title } from "@/components/text/Title";
import { Description } from "@/components/text/Description";
import { Column } from "@/components/flex/Column";
import { MapComponent } from "@/components/map/SelectMap";
import { useState } from "react";
import {
Button,
NextButton,
PrevButton,
} from "@/components/button/BottomButton";
import { BuildingHeights } from "@/components/map/Processing";
import { ChevronLeft, ChevronRight, Download } from "lucide-react";
import { useAreaStore } from "@/state/areaStore";
import { useActionStore } from "@/state/exportStore";
import { Modal } from "@/components/modal/Modal";
import { TopNav } from "@/components/nav/TopNav";
import { getCookie } from "@/utils/cookie";
import { Row } from "@/components/flex/Row";
import instanceFleet from "@/api/axios";
const IconSize = css({
width: "14px",
height: "14px",
});
function App() {
const [isNextButtonDisabled, setIsNextButtonDisabled] = useState(true);
const [areaData, setAreaData] = useState([]);
const [steps, setSteps] = useState(["front", "processing"]);
const [step, setStep] = useState(0);
const [isWarnModal, setIsWarnModal] = useState(false);
const [isExportModal, setIsExportModal] = useState(false);
const [isFleetLogin, setIsFleetLogin] = useState(false);
const [isFleetModal, setIsFleetModal] = useState(false);
const [spaceList, setSpaceList] = useState([]);
const setCenter = useAreaStore((state) => state.setCenter);
const setAction = useActionStore((state) => state.setAction);
const setFleet = useActionStore((state) => state.setFleet);
const checkIsBig = () => {
const a = areaData[0].lat - areaData[1].lat;
const b = areaData[0].lng - areaData[1].lng;
console.log(a + b);
if (a + b > 0.1) {
return true;
} else {
return false;
}
};
const exportFile = () => {
setAction(true);
};
const exportFleet = () => {
setAction(true);
};
const getFleetSpaces = async () => {
const getSpace: any = await instanceFleet.get("space");
setSpaceList([
...getSpace.data.spaces.map((item) => {
return {
...item,
key: item.id,
};
}),
]);
};
const putGlbOnFleetSpace = (spaceId) => {
setFleet(spaceId, "fleet");
setTimeout(() => {
exportFleet();
}, 100);
};
const loadFleetSpace = () => {
getFleetSpaces();
setIsFleetModal(true);
};
const checkFleetLogin = () => {
try {
const isCookie = getCookie("token");
if (isCookie) {
setIsFleetLogin(true);
}
} catch (error) {}
};
const handleDone = (data) => {
setAreaData(data);
setCenter(data);
console.log(data, "AAEE");
setIsNextButtonDisabled(false);
};
const handleRemove = () => {
setAreaData([]);
setIsNextButtonDisabled(true);
};
const handleClickNextStep = () => {
if (step == 0 && checkIsBig()) {
setIsWarnModal(true);
return false;
}
setStep(step + 1);
};
const handleClickPrevStep = () => {
setStep(step - 1);
};
const handleClickExport = () => {
setIsExportModal(true);
};
useState(() => {
checkFleetLogin();
}, []);
return (
<div css={css({ height: "100%", width: "100%" })}>
<TopNav step={step} />
<FullscreenModal isOpen={steps[step] == "front"}>
<Column gap="1rem">
<Column gap="0.5rem">
<Title>Generate 3d map</Title>
<Description>
Tools to create 3D maps based on maps and export them in 3D format
</Description>
</Column>
<MapComponent
onRemove={handleRemove}
onDone={handleDone}
></MapComponent>
</Column>
</FullscreenModal>
<FullscreenModal isOpen={steps[step] == "processing"}>
<Column gap="1rem">
<Column gap="0.5rem">
<Title>Processing</Title>
<Description>
Click the button below to get the building information.
</Description>
<BuildingHeights area={areaData} />
</Column>
</Column>
</FullscreenModal>
<PrevButton isShow={step != 0} onClick={handleClickPrevStep}>
<ChevronLeft css={IconSize} /> Prev Step
</PrevButton>
<NextButton
isShow={step != 2}
disabled={isNextButtonDisabled}
onClick={handleClickNextStep}
>
Next Step <ChevronRight css={IconSize} />
</NextButton>
<NextButton isShow={step == 2} onClick={handleClickExport}>
Export GLB <Download css={IconSize} />
</NextButton>
<Modal isOpen={isWarnModal} onClose={() => setIsWarnModal(false)}>
<Column gap="0.5rem">
<Title>The area is too big </Title>
<Description>Do you want to proceed?</Description>
<Button
isShow={step != 2}
disabled={isNextButtonDisabled}
onClick={() => {
setStep(step + 1);
setIsWarnModal(false);
}}
>
Next Step <ChevronRight css={IconSize} />
</Button>
</Column>
</Modal>
<Modal isOpen={isExportModal} onClose={() => setIsExportModal(false)}>
<Column gap="0.5rem">
<Title>Export</Title>
<Row gap="0.5rem">
<Button isShow={true} onClick={exportFile}>
GLB Download <Download css={IconSize} />
</Button>
{isFleetLogin ? (
<Button isShow={true} onClick={loadFleetSpace}>
Fleet Interlock
</Button>
) : (
<Button
isShow={true}
onClick={() => window.open("https://fleet.im/auth")}
>
Fleet Login
</Button>
)}
</Row>
</Column>
</Modal>
<Modal isOpen={isFleetModal} onClose={() => setIsFleetModal(false)}>
<Column gap="0.5rem">
<Title>Select Fleet Space</Title>
{spaceList.map((item, index) => (
<Button isShow={true} onClick={() => putGlbOnFleetSpace(item.id)}>
{item.title}
</Button>
))}
</Column>
</Modal>
<Space></Space>
</div>
);
}
export default App;