238 lines
6.3 KiB
TypeScript
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;
|