- {sources?.map((source) => source.isNote ? (
-
-
- {source.source}
-
- ) : (
-
-
- {cleanUrl(source.source)}
-
- ))}
+
>
)}
diff --git a/apps/web/src/components/MemoryDrawer.tsx b/apps/web/src/components/MemoryDrawer.tsx
index a71d3d19..14283281 100644
--- a/apps/web/src/components/MemoryDrawer.tsx
+++ b/apps/web/src/components/MemoryDrawer.tsx
@@ -32,18 +32,18 @@ export function MemoryDrawer({ className, hide = false, ...props }: Props) {
)}
handle={false}
>
-
- setActiveSnapPoint((prev) => (prev === 0.9 ? 0.1 : 0.9))
- }
- className="bg-rgray-4 border-rgray-6 text-rgray-11 absolute left-1/2 top-0 flex w-fit -translate-x-1/2 -translate-y-1/2 items-center justify-center gap-2 rounded-md border px-3 py-2"
- >
-
- Memories
-
-
-
-
+
+ setActiveSnapPoint((prev) => (prev === 0.9 ? 0.1 : 0.9))
+ }
+ className="bg-rgray-4 border-rgray-6 text-rgray-11 absolute left-1/2 top-0 flex w-fit -translate-x-1/2 -translate-y-1/2 items-center justify-center gap-2 rounded-md border px-3 py-2"
+ >
+
+ Memories
+
+
+
+
diff --git a/apps/web/src/components/Sidebar/DeleteConfirmation.tsx b/apps/web/src/components/Sidebar/DeleteConfirmation.tsx
index 9324b147..7955df0d 100644
--- a/apps/web/src/components/Sidebar/DeleteConfirmation.tsx
+++ b/apps/web/src/components/Sidebar/DeleteConfirmation.tsx
@@ -1,18 +1,30 @@
-import { Dialog, DialogContent, DialogTrigger, DialogTitle, DialogDescription, DialogClose, DialogFooter } from "../ui/dialog";
+import {
+ Dialog,
+ DialogContent,
+ DialogTrigger,
+ DialogTitle,
+ DialogDescription,
+ DialogClose,
+ DialogFooter,
+} from "../ui/dialog";
-export default function DeleteConfirmation({ onDelete, trigger = true, children }: { trigger?: boolean, onDelete?: () => void; children: React.ReactNode }) {
- return (
-
- {trigger ? (
-
- {children}
-
- ) : (
- <>
- {children}
- >
- )}
-
+export default function DeleteConfirmation({
+ onDelete,
+ trigger = true,
+ children,
+}: {
+ trigger?: boolean;
+ onDelete?: () => void;
+ children: React.ReactNode;
+}) {
+ return (
+
+ {trigger ? (
+ {children}
+ ) : (
+ <>{children}>
+ )}
+
Are you sure?
You will not be able to recover this it.
@@ -21,7 +33,7 @@ export default function DeleteConfirmation({ onDelete, trigger = true, children
Delete
@@ -29,7 +41,7 @@ export default function DeleteConfirmation({ onDelete, trigger = true, children
Cancel
-
-
- )
+
+
+ );
}
diff --git a/apps/web/src/components/Sidebar/ExpandedSpace.tsx b/apps/web/src/components/Sidebar/ExpandedSpace.tsx
index 9e46f3fb..55d3f3f8 100644
--- a/apps/web/src/components/Sidebar/ExpandedSpace.tsx
+++ b/apps/web/src/components/Sidebar/ExpandedSpace.tsx
@@ -1,33 +1,52 @@
-import { fetchContentForSpace, getSpace } from "@/actions/db"
-import { useMemory } from "@/contexts/MemoryContext"
-import { StoredContent, StoredSpace } from '@/server/db/schema'
-import { Edit3, Loader, Plus, Search, Sparkles, StickyNote, Text, Undo2 } from "lucide-react"
-import { useEffect, useRef, useState } from "react"
-import { Input, InputWithIcon } from "../ui/input"
-import { useDebounce } from "@/hooks/useDebounce"
-import { useAutoAnimate } from "@formkit/auto-animate/react"
-import { AddMemoryModal, MemoryItem } from "./MemoriesBar"
-import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "../ui/dropdown-menu"
-import { DialogTrigger } from "../ui/dialog"
+import { fetchContentForSpace, getSpace } from "@/actions/db";
+import { useMemory } from "@/contexts/MemoryContext";
+import { StoredContent, StoredSpace } from "@/server/db/schema";
+import {
+ Edit3,
+ Loader,
+ Plus,
+ Search,
+ Sparkles,
+ StickyNote,
+ Text,
+ Undo2,
+} from "lucide-react";
+import { useEffect, useRef, useState } from "react";
+import { Input, InputWithIcon } from "../ui/input";
+import { useDebounce } from "@/hooks/useDebounce";
+import { useAutoAnimate } from "@formkit/auto-animate/react";
+import { AddMemoryModal, MemoryItem } from "./MemoriesBar";
+import {
+ DropdownMenu,
+ DropdownMenuContent,
+ DropdownMenuItem,
+ DropdownMenuTrigger,
+} from "../ui/dropdown-menu";
+import { DialogTrigger } from "../ui/dialog";
-export function ExpandedSpace({ spaceId, back }: { spaceId: number, back: () => void; }) {
-
- const { updateMemory, updateSpace, search } = useMemory()
+export function ExpandedSpace({
+ spaceId,
+ back,
+}: {
+ spaceId: number;
+ back: () => void;
+}) {
+ const { updateMemory, updateSpace, search } = useMemory();
const [parent, enableAnimations] = useAutoAnimate();
- const inputRef = useRef
(null);
+ const inputRef = useRef(null);
- const [contentForSpace, setContentForSpace] = useState([])
+ const [contentForSpace, setContentForSpace] = useState([]);
- const [lastUpdatedTitle, setLastUpdatedTitle] = useState(null);
+ const [lastUpdatedTitle, setLastUpdatedTitle] = useState(null);
- const [title, setTitle] = useState('');
- const debouncedTitle = useDebounce(title, 500)
+ const [title, setTitle] = useState("");
+ const debouncedTitle = useDebounce(title, 500);
- const [loading, setLoading] = useState(true)
+ const [loading, setLoading] = useState(true);
- const [saveLoading, setSaveLoading] = useState(false);
+ const [saveLoading, setSaveLoading] = useState(false);
const [searchQuery, setSearcyQuery] = useState("");
const [searchLoading, setSearchLoading] = useState(false);
@@ -35,33 +54,34 @@ export function ExpandedSpace({ spaceId, back }: { spaceId: number, back: () =>
const [searchResults, setSearchResults] = useState([]);
-
const [addMemoryState, setAddMemoryState] = useState<
"page" | "note" | "existing-memory" | "space" | null
>(null);
- const [isDropdownOpen, setIsDropdownOpen] = useState(false);
-
+ const [isDropdownOpen, setIsDropdownOpen] = useState(false);
- useEffect(() => {
- (async () => {
- const title = (await getSpace(spaceId))?.name ?? "";
- setTitle(title)
- setLastUpdatedTitle(title)
- setContentForSpace((await fetchContentForSpace(spaceId)) ?? [])
- setLoading(false)
- })();
- }, [])
-
- useEffect(() => {
- if (debouncedTitle.trim().length < 1 || debouncedTitle.trim() === lastUpdatedTitle?.trim()) return
- (async () => {
- setSaveLoading(true)
- await updateSpace(spaceId, debouncedTitle.trim())
- setLastUpdatedTitle(debouncedTitle)
- setSaveLoading(false)
- })()
- }, [debouncedTitle])
+ useEffect(() => {
+ (async () => {
+ const title = (await getSpace(spaceId))?.name ?? "";
+ setTitle(title);
+ setLastUpdatedTitle(title);
+ setContentForSpace((await fetchContentForSpace(spaceId)) ?? []);
+ setLoading(false);
+ })();
+ }, []);
+ useEffect(() => {
+ if (
+ debouncedTitle.trim().length < 1 ||
+ debouncedTitle.trim() === lastUpdatedTitle?.trim()
+ )
+ return;
+ (async () => {
+ setSaveLoading(true);
+ await updateSpace(spaceId, debouncedTitle.trim());
+ setLastUpdatedTitle(debouncedTitle);
+ setSaveLoading(false);
+ })();
+ }, [debouncedTitle]);
useEffect(() => {
const q = query.trim();
@@ -73,56 +93,68 @@ export function ExpandedSpace({ spaceId, back }: { spaceId: number, back: () =>
setSearchLoading(true);
(async () => {
- setSearchResults((await search(q, {
- filter: { spaces: false },
- memoriesRelativeToSpace: {
- fromSpaces: [spaceId]
- }
- })).map(i => i.memory!));
+ setSearchResults(
+ (
+ await search(q, {
+ filter: { spaces: false },
+ memoriesRelativeToSpace: {
+ fromSpaces: [spaceId],
+ },
+ })
+ ).map((i) => i.memory!),
+ );
setSearchLoading(false);
})();
}, [query]);
-
- if (loading) {
- return (
-
-
-
- )
- }
+ if (loading) {
+ return (
+
+
+
+ );
+ }
return (
-
-
-
-
- setTitle(e.target.value)}
- />
- {
- inputRef.current?.focus()
- inputRef.current?.animate({
- opacity: [1, 0.2, 1]
- }, {
- duration: 100
- })
- }} className="transition rounded-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-offset-rgray-3 focus-visible:ring-rgray-7">
- {saveLoading ? (
-
- ) : (
-
- )}
-
-
-
+
+
+
+
+ setTitle(e.target.value)}
+ />
+ {
+ inputRef.current?.focus();
+ inputRef.current?.animate(
+ {
+ opacity: [1, 0.2, 1],
+ },
+ {
+ duration: 100,
+ },
+ );
+ }}
+ className="focus-visible:ring-offset-rgray-3 focus-visible:ring-rgray-7 rounded-sm transition focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2"
+ >
+ {saveLoading ? (
+
+ ) : (
+
+ )}
+
+
+
value={searchQuery}
onChange={(e) => setSearcyQuery(e.target.value)}
/>
-
-
-
{
- if (!data) {
- setLoading(true);
- (async () => {
- const title = (await getSpace(spaceId))?.name ?? "";
- setTitle(title)
- setLastUpdatedTitle(title)
- setContentForSpace((await fetchContentForSpace(spaceId)) ?? [])
- setLoading(false)
- })();
- } else if (Object.hasOwn(data, "url")) {
- const _data = data as StoredContent;
- setContentForSpace(prev => [...prev, _data])
- }
- }} data={{ space: { title, id: spaceId }, notInSpaces: [spaceId] }} defaultSpaces={[spaceId]} type={addMemoryState}>
+
+
+
{
+ if (!data) {
+ setLoading(true);
+ (async () => {
+ const title = (await getSpace(spaceId))?.name ?? "";
+ setTitle(title);
+ setLastUpdatedTitle(title);
+ setContentForSpace((await fetchContentForSpace(spaceId)) ?? []);
+ setLoading(false);
+ })();
+ } else if (Object.hasOwn(data, "url")) {
+ const _data = data as StoredContent;
+ setContentForSpace((prev) => [...prev, _data]);
+ }
+ }}
+ data={{ space: { title, id: spaceId }, notInSpaces: [spaceId] }}
+ defaultSpaces={[spaceId]}
+ type={addMemoryState}
+ >
@@ -194,47 +231,57 @@ export function ExpandedSpace({ spaceId, back }: { spaceId: number, back: () =>
-
+
- {query.trim().length > 0 ? (
+ {query.trim().length > 0 ? (
<>
{searchResults.map((memory, i) => (
- {
- await updateMemory(memory.id, {
- removedFromSpaces: [spaceId]
- })
- setContentForSpace(prev => prev.filter(s => s.id !== memory.id))
- setSearchResults(prev => prev.filter(i => i.id !== memory.id))
- }}
- {...memory!}
- key={i}
- onDelete={() => {
- setContentForSpace(prev => prev.filter(s => s.id !== memory.id))
- setSearchResults(prev => prev.filter(i => i.id !== memory.id))
- }}
- />
+ {
+ await updateMemory(memory.id, {
+ removedFromSpaces: [spaceId],
+ });
+ setContentForSpace((prev) =>
+ prev.filter((s) => s.id !== memory.id),
+ );
+ setSearchResults((prev) =>
+ prev.filter((i) => i.id !== memory.id),
+ );
+ }}
+ {...memory!}
+ key={i}
+ onDelete={() => {
+ setContentForSpace((prev) =>
+ prev.filter((s) => s.id !== memory.id),
+ );
+ setSearchResults((prev) =>
+ prev.filter((i) => i.id !== memory.id),
+ );
+ }}
+ />
))}
>
- ) :
- contentForSpace.map(m => (
- setContentForSpace(prev => prev.filter(s => s.id !== m.id))}
- removeFromSpace={async () => {
- await updateMemory(m.id, {
- removedFromSpaces: [spaceId]
- })
- setContentForSpace(prev => prev.filter(s => s.id !== m.id))
- }}
- />
- ))
- }
-
+ ) : (
+ contentForSpace.map((m) => (
+
+ setContentForSpace((prev) => prev.filter((s) => s.id !== m.id))
+ }
+ removeFromSpace={async () => {
+ await updateMemory(m.id, {
+ removedFromSpaces: [spaceId],
+ });
+ setContentForSpace((prev) => prev.filter((s) => s.id !== m.id));
+ }}
+ />
+ ))
+ )}
+
- )
+ );
}
diff --git a/apps/web/src/contexts/MemoryContext.tsx b/apps/web/src/contexts/MemoryContext.tsx
index 5e58b6a6..09412465 100644
--- a/apps/web/src/contexts/MemoryContext.tsx
+++ b/apps/web/src/contexts/MemoryContext.tsx
@@ -36,9 +36,9 @@ export const MemoryContext = React.createContext<{
search: typeof searchMemoriesAndSpaces;
deleteSpace: typeof deleteSpace;
deleteMemory: typeof deleteMemory;
- updateMemory: typeof updateMemory;
- updateSpace: typeof updateSpaceTitle;
- addMemoriesToSpace: typeof addContentInSpaces;
+ updateMemory: typeof updateMemory;
+ updateSpace: typeof updateSpaceTitle;
+ addMemoriesToSpace: typeof addContentInSpaces;
}>({
spaces: [],
freeMemories: [],
@@ -50,7 +50,7 @@ export const MemoryContext = React.createContext<{
deleteSpace: (() => {}) as unknown as typeof deleteSpace,
updateMemory: (() => {}) as unknown as typeof updateMemory,
updateSpace: (() => {}) as unknown as typeof updateSpaceTitle,
- addMemoriesToSpace: (() => {}) as unknown as typeof addContentInSpaces,
+ addMemoriesToSpace: (() => {}) as unknown as typeof addContentInSpaces,
});
export const MemoryProvider: React.FC<
@@ -104,10 +104,10 @@ export const MemoryProvider: React.FC<
setSpaces((prev) => [...prev, addedSpace]);
const cachedMemories = (
- await fetchContentForSpace(addedSpace.id, {
+ (await fetchContentForSpace(addedSpace.id, {
offset: 0,
limit: 3,
- }) ?? []
+ })) ?? []
).map((m) => ({ ...m, space: addedSpace.id }));
setCachedMemories((prev) => [...prev, ...cachedMemories]);
@@ -141,81 +141,80 @@ export const MemoryProvider: React.FC<
};
};
- const _updateMemory: typeof updateMemory = async (id, _data) => {
- const data = await updateMemory(id, _data);
+ const _updateMemory: typeof updateMemory = async (id, _data) => {
+ const data = await updateMemory(id, _data);
- let contents: ChachedSpaceContent[] = [];
+ let contents: ChachedSpaceContent[] = [];
- await Promise.all([
- spaces.forEach(async (space) => {
- console.log("fetching ");
- const data = (
- await fetchContentForSpace(space.id, {
- offset: 0,
- limit: 3,
- }) ?? []
- ).map((data) => ({
- ...data,
- space: space.id,
- }));
- contents = [...contents, ...data];
- }),
- ]);
+ await Promise.all([
+ spaces.forEach(async (space) => {
+ console.log("fetching ");
+ const data = (
+ (await fetchContentForSpace(space.id, {
+ offset: 0,
+ limit: 3,
+ })) ?? []
+ ).map((data) => ({
+ ...data,
+ space: space.id,
+ }));
+ contents = [...contents, ...data];
+ }),
+ ]);
- const freeMemories = await fetchFreeMemories();
+ const freeMemories = await fetchFreeMemories();
- setCachedMemories(contents)
- setFreeMemories(freeMemories)
+ setCachedMemories(contents);
+ setFreeMemories(freeMemories);
-
- return data
- }
+ return data;
+ };
- const _updateSpace: typeof updateSpaceTitle = async (...params) => {
- const updatedSpace = await updateSpaceTitle(...params);
+ const _updateSpace: typeof updateSpaceTitle = async (...params) => {
+ const updatedSpace = await updateSpaceTitle(...params);
- if (updatedSpace) {
- setSpaces(prev => prev.map(
- i => i.id === updatedSpace.id ? updatedSpace : i
- ))
- }
+ if (updatedSpace) {
+ setSpaces((prev) =>
+ prev.map((i) => (i.id === updatedSpace.id ? updatedSpace : i)),
+ );
+ }
- return updatedSpace
- }
+ return updatedSpace;
+ };
- const addMemoriesToSpace: typeof addContentInSpaces = async (...params) => {
- const data = await addContentInSpaces(...params);
+ const addMemoriesToSpace: typeof addContentInSpaces = async (...params) => {
+ const data = await addContentInSpaces(...params);
- let contents: ChachedSpaceContent[] = [];
+ let contents: ChachedSpaceContent[] = [];
- await Promise.all([
- spaces.forEach(async (space) => {
- console.log("fetching ");
- const data = (
- await fetchContentForSpace(space.id, {
- offset: 0,
- limit: 3,
- }) ?? []
- ).map((data) => ({
- ...data,
- space: space.id,
- }));
- contents = [...contents, ...data];
- }),
- ]);
+ await Promise.all([
+ spaces.forEach(async (space) => {
+ console.log("fetching ");
+ const data = (
+ (await fetchContentForSpace(space.id, {
+ offset: 0,
+ limit: 3,
+ })) ?? []
+ ).map((data) => ({
+ ...data,
+ space: space.id,
+ }));
+ contents = [...contents, ...data];
+ }),
+ ]);
- const freeMemories = await fetchFreeMemories();
+ const freeMemories = await fetchFreeMemories();
- setCachedMemories(contents)
- setFreeMemories(freeMemories)
+ setCachedMemories(contents);
+ setFreeMemories(freeMemories);
- return data
- }
+ return data;
+ };
return (