mirror of
https://github.com/logos-messaging/OpChan.git
synced 2026-01-03 13:23:08 +00:00
Add ability for users to follow other users and see their posts in a personalized feed. Following data is stored locally in IndexedDB. Core (@opchan/core): - Add Following type and FollowingCache interface - Add FOLLOWING store to IndexedDB schema (v6) - Add following CRUD methods to LocalDatabase - Create FollowingService with follow/unfollow/toggle methods - Add getFollowingPostsFromCache transformer function - Export FollowingService from core index React (@opchan/react): - Add following state to ContentSlice in opchanStore - Add following methods to useContent hook: - toggleFollow, followUser, unfollowUser - isFollowing (sync), getFollowingPosts, clearAllFollowing - Add comprehensive JSDoc documentation with examples App: - Create FollowButton component - Create FollowingCard and FollowingList components - Create FollowingPage with Following and Feed tabs - Add follow/unfollow button to PostCard and PostDetail - Add FOLLOWING nav link to Header - Add /following route to App 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Opchan
TypeScript libraries for building decentralized, Waku-powered forums.
Packages
@opchan/core– Core browser library: Waku messaging, local database, identity/ENS & Ordinals resolution, delegation, and forum actions.@opchan/react– React provider and hooks on top of@opchan/core.
Install
# core only
npm i @opchan/core
# react integration
npm i @opchan/react @opchan/core react react-dom
Quickstart
React
import React from 'react';
import { createRoot } from 'react-dom/client';
import { OpChanProvider, useForum } from '@opchan/react';
const config = { ordiscanApiKey: 'YOUR_ORDISCAN_API_KEY' };
function NewPostButton({ cellId }: { cellId: string }) {
const { content, permissions } = useForum();
return (
<button
disabled={!permissions.canPost}
onClick={() => content.createPost({ cellId, title: 'Hello', content: 'World' })}
>
New post
</button>
);
}
function App() {
return (
<OpChanProvider config={config}>
<NewPostButton cellId="general" />
</OpChanProvider>
);
}
createRoot(document.getElementById('root')!).render(<App />);
More details:
- React API docs:
packages/react/README.md
Development
This is an npm workspace. From the repo root:
# install all deps
npm install
# build all packages
npm run build
# build a specific package
npm run build --workspace=@opchan/core
npm run build --workspace=@opchan/react
# watch mode during development
npm run dev --workspace=@opchan/core
npm run dev --workspace=@opchan/react
# test & lint
npm test
npm run lint
License
MIT
Description
Languages
TypeScript
98.6%
CSS
1%
JavaScript
0.3%
HTML
0.1%