这是indexloc提供的服务,不要输入任何密码
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
6ca2f09
fix sizing of onboarding modals & lint
shatfield4 Nov 27, 2023
26458e7
fix extra scrolling on mobile onboarding flow
shatfield4 Nov 27, 2023
1ebd3ae
added message to use desktop for onboarding
shatfield4 Nov 27, 2023
67fc8d5
linting
shatfield4 Nov 27, 2023
24dde67
add arrow to scroll to bottom (debounced) and fix chat scrolling to a…
shatfield4 Nov 29, 2023
67f97e1
fix for empty chat
shatfield4 Nov 29, 2023
0587454
change mobile alert copy
timothycarambat Dec 4, 2023
6f4f25d
Merge branch 'master' of github.com:Mintplex-Labs/anything-llm into 3…
timothycarambat Dec 4, 2023
d8a0d1d
WIP adding PFP upload support
shatfield4 Nov 29, 2023
9e14ba6
WIP pfp for users
shatfield4 Nov 29, 2023
3e46930
edit account menu complete with change username/password and upload p…
shatfield4 Nov 30, 2023
224442b
add pfp context to update all instances of usePfp hook on update
shatfield4 Nov 30, 2023
b3f92ec
linting
shatfield4 Nov 30, 2023
9fcdf6e
add context for logo change to immediately update logo
shatfield4 Nov 30, 2023
a50848a
fix div with bullet points to use list-disc instead
shatfield4 Dec 4, 2023
9b47e7a
Merge branch '396-modal-sizes-too-big-in-onboarding-flow' of github.c…
shatfield4 Dec 4, 2023
94ccbb6
Merge branch '396-modal-sizes-too-big-in-onboarding-flow' into user-p…
shatfield4 Dec 4, 2023
341b7a4
Merge branch 'master' into user-pfp-and-logo-context
shatfield4 Dec 7, 2023
69695c2
fix: small changes
timothycarambat Dec 7, 2023
dd93db4
update multer file storage locations
timothycarambat Dec 7, 2023
4d8ca63
fix: use STORAGE_DIR for filepathing
timothycarambat Dec 7, 2023
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
130 changes: 68 additions & 62 deletions frontend/src/App.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ import PrivateRoute, {
import { ToastContainer } from "react-toastify";
import "react-toastify/dist/ReactToastify.css";
import Login from "@/pages/Login";
import { PfpProvider } from "./PfpContext";
import { LogoProvider } from "./LogoContext";

const Main = lazy(() => import("@/pages/Main"));
const InvitePage = lazy(() => import("@/pages/Invite"));
Expand Down Expand Up @@ -40,69 +42,73 @@ export default function App() {
return (
<Suspense fallback={<div />}>
<ContextWrapper>
<Routes>
<Route path="/" element={<PrivateRoute Component={Main} />} />
<Route path="/login" element={<Login />} />
<Route
path="/workspace/:slug"
element={<PrivateRoute Component={WorkspaceChat} />}
/>
<Route path="/accept-invite/:code" element={<InvitePage />} />
<LogoProvider>
<PfpProvider>
<Routes>
<Route path="/" element={<PrivateRoute Component={Main} />} />
<Route path="/login" element={<Login />} />
<Route
path="/workspace/:slug"
element={<PrivateRoute Component={WorkspaceChat} />}
/>
<Route path="/accept-invite/:code" element={<InvitePage />} />

{/* Admin */}
<Route
path="/settings/llm-preference"
element={<AdminRoute Component={GeneralLLMPreference} />}
/>
<Route
path="/settings/embedding-preference"
element={<AdminRoute Component={GeneralEmbeddingPreference} />}
/>
<Route
path="/settings/vector-database"
element={<AdminRoute Component={GeneralVectorDatabase} />}
/>
{/* Manager */}
<Route
path="/settings/export-import"
element={<ManagerRoute Component={GeneralExportImport} />}
/>
<Route
path="/settings/security"
element={<ManagerRoute Component={GeneralSecurity} />}
/>
<Route
path="/settings/appearance"
element={<ManagerRoute Component={GeneralAppearance} />}
/>
<Route
path="/settings/api-keys"
element={<ManagerRoute Component={GeneralApiKeys} />}
/>
<Route
path="/settings/workspace-chats"
element={<ManagerRoute Component={GeneralChats} />}
/>
<Route
path="/settings/system-preferences"
element={<ManagerRoute Component={AdminSystem} />}
/>
<Route
path="/settings/invites"
element={<ManagerRoute Component={AdminInvites} />}
/>
<Route
path="/settings/users"
element={<ManagerRoute Component={AdminUsers} />}
/>
<Route
path="/settings/workspaces"
element={<ManagerRoute Component={AdminWorkspaces} />}
/>
{/* Onboarding Flow */}
<Route path="/onboarding" element={<OnboardingFlow />} />
</Routes>
<ToastContainer />
{/* Admin */}
<Route
path="/settings/llm-preference"
element={<AdminRoute Component={GeneralLLMPreference} />}
/>
<Route
path="/settings/embedding-preference"
element={<AdminRoute Component={GeneralEmbeddingPreference} />}
/>
<Route
path="/settings/vector-database"
element={<AdminRoute Component={GeneralVectorDatabase} />}
/>
{/* Manager */}
<Route
path="/settings/export-import"
element={<ManagerRoute Component={GeneralExportImport} />}
/>
<Route
path="/settings/security"
element={<ManagerRoute Component={GeneralSecurity} />}
/>
<Route
path="/settings/appearance"
element={<ManagerRoute Component={GeneralAppearance} />}
/>
<Route
path="/settings/api-keys"
element={<ManagerRoute Component={GeneralApiKeys} />}
/>
<Route
path="/settings/workspace-chats"
element={<ManagerRoute Component={GeneralChats} />}
/>
<Route
path="/settings/system-preferences"
element={<ManagerRoute Component={AdminSystem} />}
/>
<Route
path="/settings/invites"
element={<ManagerRoute Component={AdminInvites} />}
/>
<Route
path="/settings/users"
element={<ManagerRoute Component={AdminUsers} />}
/>
<Route
path="/settings/workspaces"
element={<ManagerRoute Component={AdminWorkspaces} />}
/>
{/* Onboarding Flow */}
<Route path="/onboarding" element={<OnboardingFlow />} />
</Routes>
<ToastContainer />
</PfpProvider>
</LogoProvider>
</ContextWrapper>
</Suspense>
);
Expand Down
28 changes: 28 additions & 0 deletions frontend/src/LogoContext.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import { createContext, useEffect, useState } from "react";
import AnythingLLM from "./media/logo/anything-llm.png";
import System from "./models/system";

export const LogoContext = createContext();

export function LogoProvider({ children }) {
const [logo, setLogo] = useState("");

useEffect(() => {
async function fetchInstanceLogo() {
try {
const logoURL = await System.fetchLogo();
logoURL ? setLogo(logoURL) : setLogo(AnythingLLM);
} catch (err) {
setLogo(AnythingLLM);
console.error("Failed to fetch logo:", err);
}
}
fetchInstanceLogo();
}, []);

return (
<LogoContext.Provider value={{ logo, setLogo }}>
{children}
</LogoContext.Provider>
);
}
30 changes: 30 additions & 0 deletions frontend/src/PfpContext.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import React, { createContext, useState, useEffect } from "react";
import useUser from "./hooks/useUser";
import System from "./models/system";

export const PfpContext = createContext();

export function PfpProvider({ children }) {
const [pfp, setPfp] = useState(null);
const { user } = useUser();

useEffect(() => {
async function fetchPfp() {
if (!user?.id) return;
try {
const pfpUrl = await System.fetchPfp(user.id);
setPfp(pfpUrl);
} catch (err) {
setPfp(null);
console.error("Failed to fetch pfp:", err);
}
}
fetchPfp();
}, [user?.id]);

return (
<PfpContext.Provider value={{ pfp, setPfp }}>
{children}
</PfpContext.Provider>
);
}
29 changes: 16 additions & 13 deletions frontend/src/components/UserIcon/index.jsx
Original file line number Diff line number Diff line change
@@ -1,32 +1,35 @@
import React, { useRef, useEffect } from "react";
import JAZZ from "@metamask/jazzicon";
import usePfp from "../../hooks/usePfp";

export default function Jazzicon({ size = 10, user, role }) {
const { pfp } = usePfp();
const divRef = useRef(null);
const seed = user?.uid
? toPseudoRandomInteger(user.uid)
: Math.floor(100000 + Math.random() * 900000);
const result = JAZZ(size, seed);

useEffect(() => {
if (!divRef || !divRef.current) return null;
if (!divRef.current || (role === "user" && pfp)) return;

const result = JAZZ(size, seed);
divRef.current.appendChild(result);
}, []); // eslint-disable-line react-hooks/exhaustive-deps
}, [pfp, role, seed, size]);

return (
<div
className={`flex ${role === "user" ? "user-reply" : ""}`}
ref={divRef}
/>
<div className="relative w-[35px] h-[35px] rounded-full flex-shrink-0 overflow-hidden">
<div ref={divRef} />
{role === "user" && pfp && (
<img
src={pfp}
alt="User profile picture"
className="absolute top-0 left-0 w-full h-full object-cover rounded-full bg-white"
/>
)}
</div>
);
}

function toPseudoRandomInteger(uidString = "") {
var numberArray = [uidString.length];
for (var i = 0; i < uidString.length; i++) {
numberArray[i] = uidString.charCodeAt(i);
}

return numberArray.reduce((a, b) => a + b, 0);
return uidString.split("").reduce((acc, char) => acc + char.charCodeAt(0), 0);
}
Loading