--- title: 'Examples' description: 'Common use cases and implementation patterns' --- ## With Pagination Load documents in chunks for better performance with large datasets. ```tsx 'use client'; import { MemoryGraph } from '@supermemory/memory-graph'; import type { DocumentWithMemories } from '@supermemory/memory-graph'; import { useCallback, useEffect, useState } from 'react'; export default function PaginatedGraph() { const [documents, setDocuments] = useState([]); const [page, setPage] = useState(1); const [hasMore, setHasMore] = useState(true); const [isLoading, setIsLoading] = useState(true); const [isLoadingMore, setIsLoadingMore] = useState(false); // Initial load useEffect(() => { fetchPage(1, false); }, []); const fetchPage = async (pageNum: number, append: boolean) => { if (pageNum === 1) { setIsLoading(true); } else { setIsLoadingMore(true); } const res = await fetch(`/api/graph?page=${pageNum}&limit=100`); const data = await res.json(); if (append) { setDocuments(prev => [...prev, ...data.documents]); } else { setDocuments(data.documents); } setHasMore(data.pagination.currentPage < data.pagination.totalPages); setIsLoading(false); setIsLoadingMore(false); }; const loadMore = useCallback(async () => { if (!isLoadingMore && hasMore) { const nextPage = page + 1; setPage(nextPage); await fetchPage(nextPage, true); } }, [page, hasMore, isLoadingMore]); return (
); } ``` ## Highlighting Search Results ```tsx 'use client'; import { MemoryGraph } from '@supermemory/memory-graph'; import { useState } from 'react'; export default function SearchableGraph() { const [documents, setDocuments] = useState([]); const [searchResults, setSearchResults] = useState([]); const [searchQuery, setSearchQuery] = useState(''); const handleSearch = async (query: string) => { setSearchQuery(query); if (!query) { setSearchResults([]); return; } const res = await fetch(`/api/search?q=${encodeURIComponent(query)}`); const data = await res.json(); // Extract document IDs from search results const docIds = data.results.map(r => r.documentId); setSearchResults(docIds); }; return (
handleSearch(e.target.value)} style={{ padding: '8px 12px', borderRadius: 8, border: '1px solid #333', background: '#1a1a1a', color: 'white', }} />
0} />
); } ``` ## Controlled Space Selection Control space filtering from outside the component. ```tsx 'use client'; import { MemoryGraph } from '@supermemory/memory-graph'; import { useState } from 'react'; export default function ControlledSpaceGraph() { const [documents, setDocuments] = useState([]); const [selectedSpace, setSelectedSpace] = useState('all'); // Extract available spaces from documents const spaces = Array.from( new Set( documents.flatMap(doc => doc.memoryEntries.map(m => m.spaceId || 'default') ) ) ); return (

Filters

); } ``` ## Embedded Widget Use the consumer variant for embedded views with custom styling. ```tsx 'use client'; import { MemoryGraph } from '@supermemory/memory-graph'; export default function EmbeddedGraph({ documents }) { return (

No memories to display

); } ``` ## With Loading States ```tsx 'use client'; import { MemoryGraph } from '@supermemory/memory-graph'; import { useEffect, useState } from 'react'; export default function LoadingGraph() { const [documents, setDocuments] = useState([]); const [isLoading, setIsLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { fetch('/api/graph') .then(res => { if (!res.ok) throw new Error('Failed to load graph'); return res.json(); }) .then(data => { setDocuments(data.documents); setIsLoading(false); }) .catch(err => { setError(err); setIsLoading(false); }); }, []); return (

Welcome to your Memory Graph

Add some content to get started

); } ``` ## React Server Component ```tsx // Next.js App Router with Server Component import { MemoryGraphClient } from './memory-graph-client'; async function getGraphData() { const res = await fetch('https://api.supermemory.ai/v3/documents/documents', { method: 'POST', headers: { 'Authorization': `Bearer ${process.env.SUPERMEMORY_API_KEY}`, 'Content-Type': 'application/json', }, body: JSON.stringify({ page: 1, limit: 500, sort: 'createdAt', order: 'desc', }), cache: 'no-store', // or use revalidation }); return res.json(); } export default async function GraphPage() { const data = await getGraphData(); return ; } ``` ```tsx // memory-graph-client.tsx 'use client'; import { MemoryGraph } from '@supermemory/memory-graph'; import type { DocumentWithMemories } from '@supermemory/memory-graph'; interface Props { initialDocuments: DocumentWithMemories[]; } export function MemoryGraphClient({ initialDocuments }: Props) { return (
); } ``` ## Mobile-Responsive Layout ```tsx 'use client'; import { MemoryGraph } from '@supermemory/memory-graph'; import { useState, useEffect } from 'react'; export default function ResponsiveGraph({ documents }) { const [isMobile, setIsMobile] = useState(false); useEffect(() => { const checkMobile = () => { setIsMobile(window.innerWidth < 768); }; checkMobile(); window.addEventListener('resize', checkMobile); return () => window.removeEventListener('resize', checkMobile); }, []); return (
); } ```