diff --git a/apps/console/src/layouts/MainLayout.tsx b/apps/console/src/layouts/MainLayout.tsx index 68edfcd69..7043742df 100644 --- a/apps/console/src/layouts/MainLayout.tsx +++ b/apps/console/src/layouts/MainLayout.tsx @@ -33,6 +33,7 @@ import { Suspense } from "react"; import { useToast } from "@probo/ui"; import { ErrorBoundary } from "react-error-boundary"; import { PageError } from "/components/PageError"; +import { buildEndpoint } from "/providers/RelayProviders"; const MainLayoutQuery = graphql` query MainLayoutQuery { @@ -156,7 +157,7 @@ function UserDropdown() { ) => { e.preventDefault(); - fetch(import.meta.env.VITE_API_URL + "/api/console/v1/auth/logout", { + fetch(buildEndpoint("/api/console/v1/auth/logout"), { method: "DELETE", headers: { "Content-Type": "application/json", diff --git a/apps/console/src/pages/DocumentSigningRequestsPage.tsx b/apps/console/src/pages/DocumentSigningRequestsPage.tsx index a986c8757..27bb75b3d 100644 --- a/apps/console/src/pages/DocumentSigningRequestsPage.tsx +++ b/apps/console/src/pages/DocumentSigningRequestsPage.tsx @@ -6,9 +6,10 @@ import { Card, Markdown, IconCheckmark1, - IconCircleProgress + IconCircleProgress, } from "@probo/ui"; import { ProgressBar } from "../components/documentSigning/ProgressBar"; +import { buildEndpoint } from "/providers/RelayProviders"; type Document = { document_version_id: string; @@ -30,12 +31,15 @@ export default function DocumentSigningRequestsPage() { const [loading, setLoading] = useState(true); const [error, setError] = useState(null); - const [signingData, setSigningData] = useState(null); + const [signingData, setSigningData] = + useState(null); const [currentDocIndex, setCurrentDocIndex] = useState(0); useEffect(() => { if (!token) { - setError(__("Missing signing token. Please check your URL and try again.")); + setError( + __("Missing signing token. Please check your URL and try again.") + ); setLoading(false); return; } @@ -43,14 +47,14 @@ export default function DocumentSigningRequestsPage() { async function fetchDocuments() { try { const response = await fetch( - `${import.meta.env.VITE_API_URL}/api/console/v1/documents/signing-requests`, + buildEndpoint("/api/console/v1/documents/signing-requests"), { method: "GET", headers: { Authorization: `Bearer ${token}`, "Content-Type": "application/json", }, - }, + } ); if (!response.ok) { @@ -71,7 +75,7 @@ export default function DocumentSigningRequestsPage() { }); } catch (err) { setError( - err instanceof Error ? err.message : __("An unknown error occurred"), + err instanceof Error ? err.message : __("An unknown error occurred") ); } finally { setLoading(false); @@ -88,14 +92,16 @@ export default function DocumentSigningRequestsPage() { try { const response = await fetch( - `${import.meta.env.VITE_API_URL}/api/console/v1/documents/signing-requests/${docToSign.document_version_id}/sign`, + buildEndpoint( + `/api/console/v1/documents/signing-requests/${docToSign.document_version_id}/sign` + ), { method: "POST", headers: { Authorization: `Bearer ${token}`, "Content-Type": "application/json", }, - }, + } ); if (!response.ok) { @@ -117,7 +123,9 @@ export default function DocumentSigningRequestsPage() { setCurrentDocIndex(currentDocIndex + 1); } } catch (err) { - setError(err instanceof Error ? err.message : __("Failed to sign document")); + setError( + err instanceof Error ? err.message : __("Failed to sign document") + ); } }; @@ -146,7 +154,9 @@ export default function DocumentSigningRequestsPage() {
-

{__("Loading Signing Requests")}

+

+ {__("Loading Signing Requests")} +

{__("Please wait while we fetch your documents...")}

@@ -164,7 +174,9 @@ export default function DocumentSigningRequestsPage() { {__("Error")}
-

{__("Error")}

+

+ {__("Error")} +

{error}

{__("Already have an account?")}{" "} - + {__("Log in here")}

diff --git a/apps/console/src/providers/RelayProviders.tsx b/apps/console/src/providers/RelayProviders.tsx index 7dd29ae1e..beb8caa2c 100644 --- a/apps/console/src/providers/RelayProviders.tsx +++ b/apps/console/src/providers/RelayProviders.tsx @@ -23,6 +23,27 @@ export class InternalServerError extends Error { } } +export function buildEndpoint(path: string): string { + const host = import.meta.env.VITE_API_URL; + + if (!host) { + return path; + } + + const formattedHost = + host.startsWith("http://") || host.startsWith("https://") + ? host + : `https://${host}`; + + const url = new URL(formattedHost); + + if (path) { + url.pathname = path.startsWith("/") ? path : `/${path}`; + } + + return url.toString(); +} + const hasUnauthenticatedError = (error: GraphQLError) => error.extensions?.code == "UNAUTHENTICATED"; @@ -79,7 +100,7 @@ const fetchRelay: FetchFunction = async ( } const response = await fetch( - import.meta.env.VITE_API_URL + "/api/console/v1/query", + buildEndpoint("/api/console/v1/query"), requestInit );