Files
multica/packages/core/hooks.tsx
Naiyuan Qing e1e7f68330 feat: extract packages/core — Turborepo infrastructure + headless business logic
Phase 1: Monorepo infrastructure
- Add Turborepo with turbo.json pipeline (build, dev, typecheck, test)
- Update pnpm-workspace.yaml to include packages/*
- Create shared TypeScript config (packages/tsconfig)

Phase 2: Extract packages/core (zero react-dom, all-platform reuse)
- Move domain types, API client, logger, utils → packages/core/
- Move TanStack Query modules (issues, inbox, workspace, runtimes)
- Move Zustand stores (auth, workspace, issues, navigation, modals)
- Move realtime sync (WSProvider, hooks, ws-updaters)
- Refactor auth/workspace stores to factory pattern for DI
- Refactor ApiClient with onUnauthorized callback
- Refactor useWorkspaceId to React Context (WorkspaceIdProvider)
- Refactor WSProvider to accept wsUrl + store props
- Create apps/web/platform/ bridge layer (api singleton, store instances)
- Update 91 import paths across apps/web/
- Fix 3 test files for new import paths

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 10:20:00 +08:00

26 lines
572 B
TypeScript

"use client";
import { createContext, useContext } from "react";
const WorkspaceIdContext = createContext<string | null>(null);
export function WorkspaceIdProvider({
wsId,
children,
}: {
wsId: string;
children: React.ReactNode;
}) {
return (
<WorkspaceIdContext.Provider value={wsId}>
{children}
</WorkspaceIdContext.Provider>
);
}
export function useWorkspaceId(): string {
const wsId = useContext(WorkspaceIdContext);
if (!wsId) throw new Error("useWorkspaceId: no workspace selected — wrap in WorkspaceIdProvider");
return wsId;
}