diff --git a/packages/client/src/admin/data/arcgis/ArcGISCartModal.tsx b/packages/client/src/admin/data/arcgis/ArcGISCartModal.tsx index cfc53fc6..f31c92e4 100644 --- a/packages/client/src/admin/data/arcgis/ArcGISCartModal.tsx +++ b/packages/client/src/admin/data/arcgis/ArcGISCartModal.tsx @@ -47,6 +47,13 @@ import { useCreateBasemapMutation, useImportArcGisServiceMutation, } from "../../../generated/graphql"; +import ReactDOM from "react-dom"; +import { + MotionValue, + motion, + useMotionValue, + useTransform, +} from "framer-motion"; const requestManager = new ArcGISRESTServiceRequestManager(); @@ -675,7 +682,19 @@ export default function ArcGISCartModal({ }, refetchQueries: [DraftTableOfContentsDocument], }); - hideLoadingMessage(); + updateLoadingMessage( +
+
{t("Service imported")}
+ + setTimeout(() => { + hideLoadingMessage(); + }, 500) + } + /> +
, + true + ); } catch (e) { hideLoadingMessage(); alert(t("Error importing service"), { @@ -977,3 +996,61 @@ function LoadingSkeleton() { ); } + +function CircularProgress({ progress }: { progress: MotionValue }) { + const circleLength = useTransform(progress, [0, 100], [0, 1]); + const checkmarkPathLength = useTransform(progress, [0, 95, 100], [0, 0, 1]); + const circleColor = useTransform( + progress, + [0, 95, 100], + ["#FFCC66", "#FFCC66", "#66BB66"] + ); + + return ( + + {/* Check mark */} + + {/* Circle */} + + + ); +} + +function FinishedImportAnimation({ + onAnimationComplete, +}: { + onAnimationComplete: () => void; +}) { + let progress = useMotionValue(90); + return ( +
+ + +
+ ); +} diff --git a/packages/client/src/components/useDialog.tsx b/packages/client/src/components/useDialog.tsx index 22e6cb31..540775e6 100644 --- a/packages/client/src/components/useDialog.tsx +++ b/packages/client/src/components/useDialog.tsx @@ -44,11 +44,15 @@ export default function useDialog() { hideLoadingMessage: () => { context.setState(ResetState); }, - updateLoadingMessage: (message: string) => { + updateLoadingMessage: ( + message: string | ReactNode, + complete?: boolean + ) => { context.setState((prev) => { return { ...prev, description: message, + submitting: complete ? false : true, }; }); }, @@ -139,7 +143,7 @@ type DialogContextState = { type: "prompt" | "alert" | "confirm" | "loading" | "choice"; open: boolean; message: string | ReactNode; - description?: string; + description?: string | ReactNode; defaultValue?: string; submitting: boolean; onSubmit?: (value: string) => void | Promise; @@ -290,7 +294,7 @@ export function DialogProvider({ children }: { children?: ReactNode }) {
{state.type === "loading" && (
- + {state.submitting ? : ""}
{state.description}
)}