这是indexloc提供的服务,不要输入任何密码
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 30 additions & 28 deletions frontend/src/App.jsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
import React, { lazy, Suspense } from "react";
import { Routes, Route } from "react-router-dom";
import { ContextWrapper } from "./AuthContext";
import PrivateRoute, { AdminRoute } from "./components/PrivateRoute";
import PrivateRoute, {
AdminRoute,
ManagerRoute,
} from "./components/PrivateRoute";
import { ToastContainer } from "react-toastify";
import "react-toastify/dist/ReactToastify.css";
import Login from "./pages/Login";
Expand Down Expand Up @@ -48,56 +51,55 @@ export default function App() {
/>
<Route path="/accept-invite/:code" element={<InvitePage />} />

{/* General Routes */}
{/* Admin */}
<Route
path="/general/llm-preference"
element={<PrivateRoute Component={GeneralLLMPreference} />}
path="/settings/llm-preference"
element={<AdminRoute Component={GeneralLLMPreference} />}
/>
<Route
path="/general/embedding-preference"
element={<PrivateRoute Component={GeneralEmbeddingPreference} />}
path="/settings/embedding-preference"
element={<AdminRoute Component={GeneralEmbeddingPreference} />}
/>
<Route
path="/general/vector-database"
element={<PrivateRoute Component={GeneralVectorDatabase} />}
path="/settings/vector-database"
element={<AdminRoute Component={GeneralVectorDatabase} />}
/>
{/* Manager */}
<Route
path="/general/export-import"
element={<PrivateRoute Component={GeneralExportImport} />}
path="/settings/export-import"
element={<ManagerRoute Component={GeneralExportImport} />}
/>
<Route
path="/general/security"
element={<PrivateRoute Component={GeneralSecurity} />}
path="/settings/security"
element={<ManagerRoute Component={GeneralSecurity} />}
/>
<Route
path="/general/appearance"
element={<PrivateRoute Component={GeneralAppearance} />}
path="/settings/appearance"
element={<ManagerRoute Component={GeneralAppearance} />}
/>
<Route
path="/general/api-keys"
element={<PrivateRoute Component={GeneralApiKeys} />}
path="/settings/api-keys"
element={<ManagerRoute Component={GeneralApiKeys} />}
/>
<Route
path="/general/workspace-chats"
element={<PrivateRoute Component={GeneralChats} />}
path="/settings/workspace-chats"
element={<ManagerRoute Component={GeneralChats} />}
/>

{/* Admin Routes */}
<Route
path="/admin/system-preferences"
element={<AdminRoute Component={AdminSystem} />}
path="/settings/system-preferences"
element={<ManagerRoute Component={AdminSystem} />}
/>
<Route
path="/admin/invites"
element={<AdminRoute Component={AdminInvites} />}
path="/settings/invites"
element={<ManagerRoute Component={AdminInvites} />}
/>
<Route
path="/admin/users"
element={<AdminRoute Component={AdminUsers} />}
path="/settings/users"
element={<ManagerRoute Component={AdminUsers} />}
/>
<Route
path="/admin/workspaces"
element={<AdminRoute Component={AdminWorkspaces} />}
path="/settings/workspaces"
element={<ManagerRoute Component={AdminWorkspaces} />}
/>
{/* Onboarding Flow */}
<Route path="/onboarding" element={<OnboardingFlow />} />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ export default function AnthropicAiOptions({ settings, showAlert = false }) {
</p>
</div>
<a
href={paths.general.embeddingPreference()}
href={paths.settings.embeddingPreference()}
className="text-sm md:text-base my-2 underline"
>
Manage embedding &rarr;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ export default function LMStudioOptions({ settings, showAlert = false }) {
</p>
</div>
<a
href={paths.general.embeddingPreference()}
href={paths.settings.embeddingPreference()}
className="text-sm md:text-base my-2 underline"
>
Manage embedding &rarr;
Expand Down
7 changes: 6 additions & 1 deletion frontend/src/components/Modals/MangeWorkspace/index.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { useParams } from "react-router-dom";
import Workspace from "../../../models/workspace";
import System from "../../../models/system";
import { isMobile } from "react-device-detect";
import useUser from "../../../hooks/useUser";

const DocumentSettings = lazy(() => import("./Documents"));
const WorkspaceSettings = lazy(() => import("./Settings"));
Expand Down Expand Up @@ -117,9 +118,13 @@ const ManageWorkspace = ({ hideModal = noop, providedSlug = null }) => {

export default memo(ManageWorkspace);
export function useManageWorkspaceModal() {
const { user } = useUser();
const [showing, setShowing] = useState(false);

const showModal = () => {
setShowing(true);
if (user?.role !== "default") {
setShowing(true);
}
};

const hideModal = () => {
Expand Down
33 changes: 30 additions & 3 deletions frontend/src/components/PrivateRoute/index.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ function useIsAuthenticated() {
const [isAuthd, setIsAuthed] = useState(null);
const [shouldRedirectToOnboarding, setShouldRedirectToOnboarding] =
useState(false);
const [multiUserMode, setMultiUserMode] = useState(false);

useEffect(() => {
const validateSession = async () => {
Expand All @@ -25,6 +26,8 @@ function useIsAuthenticated() {
AzureOpenAiKey = false,
} = await System.keys();

setMultiUserMode(MultiUserMode);

// Check for the onboarding redirect condition
if (
!MultiUserMode &&
Expand Down Expand Up @@ -77,19 +80,43 @@ function useIsAuthenticated() {
validateSession();
}, []);

return { isAuthd, shouldRedirectToOnboarding };
return { isAuthd, shouldRedirectToOnboarding, multiUserMode };
}

// Allows only admin to access the route and if in single user mode,
// allows all users to access the route
export function AdminRoute({ Component }) {
const { isAuthd, shouldRedirectToOnboarding } = useIsAuthenticated();
const { isAuthd, shouldRedirectToOnboarding, multiUserMode } =
useIsAuthenticated();
if (isAuthd === null) return <FullScreenLoader />;

if (shouldRedirectToOnboarding) {
return <Navigate to={paths.onboarding()} />;
}

const user = userFromStorage();
return isAuthd && (user?.role === "admin" || !multiUserMode) ? (
<UserMenu>
<Component />
</UserMenu>
) : (
<Navigate to={paths.home()} />
);
}

// Allows manager and admin to access the route and if in single user mode,
// allows all users to access the route
export function ManagerRoute({ Component }) {
const { isAuthd, shouldRedirectToOnboarding, multiUserMode } =
useIsAuthenticated();
if (isAuthd === null) return <FullScreenLoader />;

if (shouldRedirectToOnboarding) {
return <Navigate to={paths.onboarding()} />;
}

const user = userFromStorage();
return isAuthd && user?.role === "admin" ? (
return isAuthd && (user?.role !== "default" || !multiUserMode) ? (
<UserMenu>
<Component />
</UserMenu>
Expand Down
Loading