diff --git a/packages/dashboard-v2/gatsby-browser.js b/packages/dashboard-v2/gatsby-browser.js
index a39bdb48..79b58e24 100644
--- a/packages/dashboard-v2/gatsby-browser.js
+++ b/packages/dashboard-v2/gatsby-browser.js
@@ -7,13 +7,16 @@ import "@fontsource/source-sans-pro/400.css"; // normal
import "@fontsource/source-sans-pro/600.css"; // semibold
import "./src/styles/global.css";
import { MODAL_ROOT_ID } from "./src/components/Modal";
+import { PortalSettingsProvider } from "./src/contexts/portal-settings";
export function wrapPageElement({ element, props }) {
const Layout = element.type.Layout ?? React.Fragment;
return (
-
- {element}
-
-
+
+
+ {element}
+
+
+
);
}
diff --git a/packages/dashboard-v2/gatsby-ssr.js b/packages/dashboard-v2/gatsby-ssr.js
index a39bdb48..79b58e24 100644
--- a/packages/dashboard-v2/gatsby-ssr.js
+++ b/packages/dashboard-v2/gatsby-ssr.js
@@ -7,13 +7,16 @@ import "@fontsource/source-sans-pro/400.css"; // normal
import "@fontsource/source-sans-pro/600.css"; // semibold
import "./src/styles/global.css";
import { MODAL_ROOT_ID } from "./src/components/Modal";
+import { PortalSettingsProvider } from "./src/contexts/portal-settings";
export function wrapPageElement({ element, props }) {
const Layout = element.type.Layout ?? React.Fragment;
return (
-
- {element}
-
-
+
+
+ {element}
+
+
+
);
}
diff --git a/packages/dashboard-v2/package.json b/packages/dashboard-v2/package.json
index 44f7595d..b760bf48 100644
--- a/packages/dashboard-v2/package.json
+++ b/packages/dashboard-v2/package.json
@@ -39,7 +39,7 @@
"react-dropzone": "^12.0.4",
"react-helmet": "^6.1.0",
"react-use": "^17.3.2",
- "skynet-js": "^3.0.2",
+ "skynet-js": "4.0.27-beta",
"swr": "^1.2.2",
"tailwindcss": "^3.0.23",
"yup": "^0.32.11"
diff --git a/packages/dashboard-v2/src/components/LoadingIndicator/FullScreenLoadingIndicator.js b/packages/dashboard-v2/src/components/LoadingIndicator/FullScreenLoadingIndicator.js
new file mode 100644
index 00000000..ad261e2e
--- /dev/null
+++ b/packages/dashboard-v2/src/components/LoadingIndicator/FullScreenLoadingIndicator.js
@@ -0,0 +1,7 @@
+import { ContainerLoadingIndicator } from "./ContainerLoadingIndicator";
+
+export const FullScreenLoadingIndicator = () => (
+
+
+
+);
diff --git a/packages/dashboard-v2/src/components/LoadingIndicator/index.js b/packages/dashboard-v2/src/components/LoadingIndicator/index.js
index df7c2a88..5e7f91f4 100644
--- a/packages/dashboard-v2/src/components/LoadingIndicator/index.js
+++ b/packages/dashboard-v2/src/components/LoadingIndicator/index.js
@@ -1 +1,2 @@
export * from "./ContainerLoadingIndicator";
+export * from "./FullScreenLoadingIndicator";
diff --git a/packages/dashboard-v2/src/components/NavBar/NavBar.js b/packages/dashboard-v2/src/components/NavBar/NavBar.js
index 65d9afe5..f75030bb 100644
--- a/packages/dashboard-v2/src/components/NavBar/NavBar.js
+++ b/packages/dashboard-v2/src/components/NavBar/NavBar.js
@@ -2,6 +2,7 @@ import { Link, navigate } from "gatsby";
import styled from "styled-components";
import { screen } from "../../lib/cssHelpers";
+import { useUser } from "../../contexts/user";
import { DropdownMenu, DropdownMenuLink } from "../DropdownMenu";
import { CogIcon, LockClosedIcon, SkynetLogoIcon } from "../Icons";
import { PageContainer } from "../PageContainer";
@@ -49,48 +50,60 @@ const NavBarBody = styled.nav.attrs({
}
`;
-export const NavBar = () => (
-
-
-
-
-
-
-
-
- Dashboard
-
-
- Files
-
-
- Payments
-
-
-
-
-
- {
- await accountsService.post("logout");
- navigate("/auth/login");
- // TODO: handle errors
- }}
- activeClassName="text-primary"
- className="cursor-pointer"
- icon={LockClosedIcon}
- label="Log out"
- />
-
-
-
-
-
-);
+export const NavBar = () => {
+ const { mutate: setUserState } = useUser();
+
+ const onLogout = async () => {
+ try {
+ await accountsService.post("logout");
+ // Don't refresh user state from server, as it will now respond with UNAUTHORIZED
+ // and user will be redirected to /auth/login with return_to query param (which we want empty).
+ await setUserState(null, { revalidate: false });
+ navigate("/auth/login");
+ } catch {
+ // Do nothing.
+ }
+ };
+
+ return (
+
+
+
+
+
+
+
+
+ Dashboard
+
+
+ Files
+
+
+ Payments
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
diff --git a/packages/dashboard-v2/src/components/Slider/Slider.js b/packages/dashboard-v2/src/components/Slider/Slider.js
index 973b9941..33c3bc2a 100644
--- a/packages/dashboard-v2/src/components/Slider/Slider.js
+++ b/packages/dashboard-v2/src/components/Slider/Slider.js
@@ -40,7 +40,8 @@ const Slider = ({ slides, breakpoints, scrollerClassName, className }) => {
);
React.useEffect(() => {
- const maxIndex = slides.length - visibleSlides;
+ // Prevent negative values for activeIndex.
+ const maxIndex = Math.max(slides.length - visibleSlides, 0);
// Make sure to not scroll too far when screen size changes.
if (activeIndex > maxIndex) {
diff --git a/packages/dashboard-v2/src/components/Uploader/UploaderItem.js b/packages/dashboard-v2/src/components/Uploader/UploaderItem.js
index 4f47809c..8ea279d6 100644
--- a/packages/dashboard-v2/src/components/Uploader/UploaderItem.js
+++ b/packages/dashboard-v2/src/components/Uploader/UploaderItem.js
@@ -5,12 +5,10 @@ import { StatusCodes } from "http-status-codes";
import copy from "copy-text-to-clipboard";
import path from "path-browserify";
import { useTimeoutFn } from "react-use";
-import { SkynetClient } from "skynet-js";
import { ProgressBar } from "./ProgressBar";
import UploaderItemIcon from "./UploaderItemIcon";
import buildUploadErrorMessage from "./buildUploadErrorMessage";
-
-const skynetClient = new SkynetClient("https://siasky.net"); //TODO: proper API url
+import skynetClient from "../../services/skynetClient";
const getFilePath = (file) => file.webkitRelativePath || file.path || file.name;
diff --git a/packages/dashboard-v2/src/components/forms/SignUpForm.js b/packages/dashboard-v2/src/components/forms/SignUpForm.js
index 976c0c74..6725c673 100644
--- a/packages/dashboard-v2/src/components/forms/SignUpForm.js
+++ b/packages/dashboard-v2/src/components/forms/SignUpForm.js
@@ -61,11 +61,6 @@ export const SignUpForm = ({ onSuccess, onFailure }) => (
>
{({ errors, touched }) => (