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}
)}