Files
multica/packages/core/workspace/index.ts
Naiyuan Qing f41a0cf423 feat(views): extract packages/views — shared business UI + navigation adapter
- Create NavigationAdapter interface (push, replace, back, pathname, searchParams)
- Create AppLink component replacing next/link in 4 files
- Replace useRouter → useNavigation in 3 files (issue-detail, create-issue, create-workspace)
- Create WebNavigationProvider wrapping Next.js useRouter/usePathname/useSearchParams
- Move ~85 feature UI files (issues, editor, modals, my-issues, skills, runtimes) to packages/views/
- Add store singleton registration pattern (registerAuthStore, registerWorkspaceStore)
- Create data-aware wrappers in packages/views/common/ (ActorAvatar, Markdown)
- Update all app-layer imports to @multica/views/*
- Add @source directive for Tailwind to scan views package
- packages/views/ has zero next/* imports

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

42 lines
1.3 KiB
TypeScript

export * from "./store";
export * from "./queries";
export * from "./mutations";
export * from "./hooks";
import type { createWorkspaceStore as CreateWorkspaceStoreFn } from "./store";
type WorkspaceStoreInstance = ReturnType<typeof CreateWorkspaceStoreFn>;
/** Module-level singleton — set once at app boot via `registerWorkspaceStore()`. */
let _store: WorkspaceStoreInstance | null = null;
/**
* Register the workspace store instance created by the app.
* Must be called at boot before any component renders.
*/
export function registerWorkspaceStore(store: WorkspaceStoreInstance) {
_store = store;
}
/**
* Singleton accessor — a Zustand hook backed by the registered instance.
* Supports `useWorkspaceStore(selector)` and `useWorkspaceStore.getState()`.
*/
export const useWorkspaceStore: WorkspaceStoreInstance = new Proxy(
(() => {}) as unknown as WorkspaceStoreInstance,
{
apply(_target, _thisArg, args) {
if (!_store)
throw new Error(
"Workspace store not initialised — call registerWorkspaceStore() first",
);
return (_store as unknown as (...a: unknown[]) => unknown)(...args);
},
get(_target, prop) {
// Allow property inspection (HMR/React Refresh) before registration
if (!_store) return undefined;
return Reflect.get(_store, prop);
},
},
);