remove the datacontext, we will useResource and other tools directly from LDO

main
Christopher Maujean 2 months ago
parent 63621ab968
commit f8296831fc
  1. 2
      CLAUDE.md
  2. 59
      src/App.tsx
  3. 12
      src/contexts/DataContext.ts
  4. 10
      src/hooks/useData.ts
  5. 49
      src/providers/DataProvider.tsx

@ -27,6 +27,8 @@ This is a React/TypeScript NAO (Network of Authentic Others) community managemen
- Always completely implement any functionality as requested.
- Do not hallucinate, or pretend
- Always use the most up to date official documentation for libraries or techniques
- prefer zustand stores above useState
- use LDO and nextgraphauth.session for persistent data (contacts for example) consider this to be our "database"
# Code Style
- Use react hooks: useMemo, useCallback, and other standard hooks

@ -2,7 +2,6 @@ import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
import { ThemeProvider } from '@mui/material/styles';
import CssBaseline from '@mui/material/CssBaseline';
import { OnboardingProvider } from '@/contexts/OnboardingContext';
import { DataProvider } from '@/providers/DataProvider';
import { BrowserNGLdoProvider, useNextGraphAuth } from '@/lib/nextgraph';
import type { NextGraphAuth } from '@/types/nextgraph';
import DashboardLayout from '@/components/layout/DashboardLayout';
@ -39,37 +38,35 @@ const AppContent = () => {
}
return (
<DataProvider>
<OnboardingProvider>
<Router>
<Routes>
<Route path="/onboarding" element={<SocialContractPage />} />
<Route path="/join-group" element={<GroupJoinPage />} />
<OnboardingProvider>
<Router>
<Routes>
<Route path="/onboarding" element={<SocialContractPage />} />
<Route path="/join-group" element={<GroupJoinPage />} />
<Route path="/*" element={
<DashboardLayout>
<Routes>
<Route path="/" element={<FeedPage />} />
<Route path="/feed" element={<FeedPage />} />
<Route path="/import" element={<ImportPage />} />
<Route path="/contacts" element={<ContactListPage />} />
<Route path="/contacts/:id" element={<ContactViewPage />} />
<Route path="/groups" element={<GroupPage />} />
<Route path="/groups/:groupId" element={<GroupDetailPage />} />
<Route path="/groups/:groupId/info" element={<GroupInfoPage />} />
<Route path="/posts" element={<PostsOffersPage />} />
<Route path="/messages" element={<MessagesPage />} />
<Route path="/notifications" element={<NotificationsPage />} />
<Route path="/account" element={<AccountPage />} />
<Route path="/invite" element={<InvitationPage />} />
<Route path="/onboarding/setup" element={<OnboardingPage />} />
</Routes>
</DashboardLayout>
} />
</Routes>
</Router>
</OnboardingProvider>
</DataProvider>
<Route path="/*" element={
<DashboardLayout>
<Routes>
<Route path="/" element={<FeedPage />} />
<Route path="/feed" element={<FeedPage />} />
<Route path="/import" element={<ImportPage />} />
<Route path="/contacts" element={<ContactListPage />} />
<Route path="/contacts/:id" element={<ContactViewPage />} />
<Route path="/groups" element={<GroupPage />} />
<Route path="/groups/:groupId" element={<GroupDetailPage />} />
<Route path="/groups/:groupId/info" element={<GroupInfoPage />} />
<Route path="/posts" element={<PostsOffersPage />} />
<Route path="/messages" element={<MessagesPage />} />
<Route path="/notifications" element={<NotificationsPage />} />
<Route path="/account" element={<AccountPage />} />
<Route path="/invite" element={<InvitationPage />} />
<Route path="/onboarding/setup" element={<OnboardingPage />} />
</Routes>
</DashboardLayout>
} />
</Routes>
</Router>
</OnboardingProvider>
);
};

@ -1,12 +0,0 @@
import { createContext } from "react";
import type { Container } from "@/.ldo/container.typings";
interface DataContextType {
contactsContainer: Container | undefined;
contacts: Array<{ "@id": string }>;
isContactsLoading: boolean;
containerOverlay: string;
}
export const DataContext = createContext<DataContextType | undefined>(undefined);
export type { DataContextType };

@ -1,10 +0,0 @@
import { useContext } from "react";
import { DataContext } from "@/contexts/DataContext";
export const useData = () => {
const context = useContext(DataContext);
if (!context) {
throw new Error("useData must be used within a DataProvider");
}
return context;
};

@ -1,49 +0,0 @@
import type React from "react";
import type { ReactNode } from "react";
import { useNextGraphAuth } from "@/lib/nextgraph";
import { useResource, useSubject } from "@/lib/nextgraph";
import { ContainerShapeType } from "@/.ldo/container.shapeTypes";
import type { NextGraphAuth } from "@/types/nextgraph";
import { DataContext, type DataContextType } from "@/contexts/DataContext";
interface DataProviderProps {
children: ReactNode;
}
export const DataProvider: React.FC<DataProviderProps> = ({ children }) => {
const nextGraphAuth = useNextGraphAuth() as NextGraphAuth;
const { session } = nextGraphAuth || {};
const isAuthenticated = Boolean(session?.ng);
const canSubscribe =
isAuthenticated && session?.privateStoreId && session?.ng;
useResource(canSubscribe ? `did:ng:${session?.privateStoreId}` : undefined, {
subscribe: true,
});
const contactsContainer = useSubject(
ContainerShapeType,
canSubscribe && session?.privateStoreId
? `did:ng:${session.privateStoreId.substring(0, 46)}`
: undefined,
);
const contacts = contactsContainer?.contains
? Array.from(contactsContainer.contains)
: [];
const isContactsLoading = canSubscribe && !contactsContainer;
const containerOverlay = session?.privateStoreId
? session.privateStoreId.substring(46)
: "";
const value: DataContextType = {
contactsContainer,
contacts,
isContactsLoading,
containerOverlay,
};
return <DataContext.Provider value={value}>{children}</DataContext.Provider>;
};
Loading…
Cancel
Save