aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/client/components/CreateNoteModal.tsx
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-01-01 23:44:50 +0900
committernsfisis <nsfisis@gmail.com>2026-01-01 23:47:21 +0900
commit2fb6471a685bec1433be3335f377a1a2313e4820 (patch)
tree328ddaeec0c591b06bf005d48b0242345c1336be /src/client/components/CreateNoteModal.tsx
parentf30566e1c7126db4c6242ab38d07a9478f79d3db (diff)
downloadkioku-2fb6471a685bec1433be3335f377a1a2313e4820.tar.gz
kioku-2fb6471a685bec1433be3335f377a1a2313e4820.tar.zst
kioku-2fb6471a685bec1433be3335f377a1a2313e4820.zip
refactor(client): migrate API calls to typed RPC client
Replace raw fetch() calls with apiClient.rpc typed client across all modal and page components. This provides better type safety and eliminates manual auth header handling. - Make handleResponse public for component usage - Update all component tests to mock RPC methods instead of fetch - Change POSTGRES_HOST default to kioku-db for Docker compatibility 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Diffstat (limited to 'src/client/components/CreateNoteModal.tsx')
-rw-r--r--src/client/components/CreateNoteModal.tsx76
1 files changed, 15 insertions, 61 deletions
diff --git a/src/client/components/CreateNoteModal.tsx b/src/client/components/CreateNoteModal.tsx
index 86a02a5..912aea8 100644
--- a/src/client/components/CreateNoteModal.tsx
+++ b/src/client/components/CreateNoteModal.tsx
@@ -53,25 +53,10 @@ export function CreateNoteModal({
setError(null);
try {
- const authHeader = apiClient.getAuthHeader();
- if (!authHeader) {
- throw new ApiClientError("Not authenticated", 401);
- }
-
- const res = await fetch(`/api/note-types/${noteTypeId}`, {
- headers: authHeader,
+ const res = await apiClient.rpc.api["note-types"][":id"].$get({
+ param: { id: noteTypeId },
});
-
- if (!res.ok) {
- const errorBody = await res.json().catch(() => ({}));
- throw new ApiClientError(
- (errorBody as { error?: string }).error ||
- `Request failed with status ${res.status}`,
- res.status,
- );
- }
-
- const data = await res.json();
+ const data = await apiClient.handleResponse<{ noteType: NoteType }>(res);
setSelectedNoteType(data.noteType);
// Initialize field values for the new note type
@@ -96,31 +81,17 @@ export function CreateNoteModal({
setError(null);
try {
- const authHeader = apiClient.getAuthHeader();
- if (!authHeader) {
- throw new ApiClientError("Not authenticated", 401);
- }
-
- const res = await fetch("/api/note-types", {
- headers: authHeader,
- });
-
- if (!res.ok) {
- const errorBody = await res.json().catch(() => ({}));
- throw new ApiClientError(
- (errorBody as { error?: string }).error ||
- `Request failed with status ${res.status}`,
- res.status,
- );
- }
-
- const data = await res.json();
+ const res = await apiClient.rpc.api["note-types"].$get();
+ const data = await apiClient.handleResponse<{
+ noteTypes: NoteTypeSummary[];
+ }>(res);
setNoteTypes(data.noteTypes);
setHasLoadedNoteTypes(true);
// Auto-select first note type if available
- if (data.noteTypes.length > 0) {
- await fetchNoteTypeDetails(data.noteTypes[0].id);
+ const firstNoteType = data.noteTypes[0];
+ if (firstNoteType) {
+ await fetchNoteTypeDetails(firstNoteType.id);
}
} catch (err) {
if (err instanceof ApiClientError) {
@@ -183,37 +154,20 @@ export function CreateNoteModal({
setIsSubmitting(true);
try {
- const authHeader = apiClient.getAuthHeader();
- if (!authHeader) {
- throw new ApiClientError("Not authenticated", 401);
- }
-
// Trim all field values
const trimmedFields: Record<string, string> = {};
for (const [fieldId, value] of Object.entries(fieldValues)) {
trimmedFields[fieldId] = value.trim();
}
- const res = await fetch(`/api/decks/${deckId}/notes`, {
- method: "POST",
- headers: {
- "Content-Type": "application/json",
- ...authHeader,
- },
- body: JSON.stringify({
+ const res = await apiClient.rpc.api.decks[":deckId"].notes.$post({
+ param: { deckId },
+ json: {
noteTypeId: selectedNoteType.id,
fields: trimmedFields,
- }),
+ },
});
-
- if (!res.ok) {
- const errorBody = await res.json().catch(() => ({}));
- throw new ApiClientError(
- (errorBody as { error?: string }).error ||
- `Request failed with status ${res.status}`,
- res.status,
- );
- }
+ await apiClient.handleResponse(res);
resetForm();
onNoteCreated();