learning_ai_notes/mobile/src/store/inbox-store.ts
saravanakumardb1 f8a4c18f27 feat(mobile): wire review note input to inbox approve/reject
- note-agent-actions API: updateApprovalState now accepts optional reviewNote
- inbox-store: approve/reject actions pass reviewNote through to backend
- Inbox screen: TextInput for review note above approval cards
- Review note cleared after successful approve/reject

Verification: mobile typecheck passes.
2026-03-10 19:41:39 -07:00

83 lines
2.1 KiB
TypeScript

import { create } from 'zustand';
import {
listActivityFeed,
listApprovalQueue,
updateApprovalState,
type MobileActivityItem,
type MobileApprovalItem,
} from '../api/note-agent-actions';
export type ApprovalItem = {
id: string;
workspaceId: string;
noteId: string;
title: string;
summary: string;
status: 'pending' | 'approved' | 'rejected';
};
export type ActivityItem = {
id: string;
title: string;
summary: string;
kind: 'note' | 'task' | 'agent';
};
export type InboxState = {
approvals: ApprovalItem[];
activity: ActivityItem[];
isLoading: boolean;
hydrate: () => Promise<void>;
approve: (id: string, reviewNote?: string) => Promise<void>;
reject: (id: string, reviewNote?: string) => Promise<void>;
};
function toApprovalItem(item: MobileApprovalItem): ApprovalItem {
return item;
}
function toActivityItem(item: MobileActivityItem): ActivityItem {
return item;
}
export const useInboxStore = create<InboxState>((set, get) => ({
approvals: [],
activity: [],
isLoading: false,
async hydrate() {
set({ isLoading: true });
const [approvals, activity] = await Promise.all([listApprovalQueue(), listActivityFeed()]);
set({
approvals: approvals.map(toApprovalItem),
activity: activity.map(toActivityItem),
isLoading: false,
});
},
async approve(id: string, reviewNote?: string) {
const current = get().approvals.find((item) => item.id === id);
if (!current) {
return;
}
const updated = await updateApprovalState(id, current.workspaceId, 'approved', reviewNote);
set((state) => ({
approvals: state.approvals.map((item) =>
item.id === id ? toApprovalItem(updated) : item,
),
}));
},
async reject(id: string, reviewNote?: string) {
const current = get().approvals.find((item) => item.id === id);
if (!current) {
return;
}
const updated = await updateApprovalState(id, current.workspaceId, 'rejected', reviewNote);
set((state) => ({
approvals: state.approvals.map((item) =>
item.id === id ? toApprovalItem(updated) : item,
),
}));
},
}));