Skip to content

Commit 06a0f8d

Browse files
boojackclaude
andcommitted
fix(web): convert visibility enum values to string names in filter expressions
Problem: The Explore page filter was sending visibility filter as: visibility in ["3", "2"] when it should send: visibility in ["PUBLIC", "PROTECTED"] The backend CEL filter parser expects string enum names, not numeric values. This caused the Explore page to return no memos even when public memos existed. Solution: - Added getVisibilityName() helper to convert Visibility enum values to string names - Updated useMemoFilters to use getVisibilityName() when building visibility filter - Follows same pattern as existing getInstanceSettingKeyName() and getUserSettingKeyName() - Added validation to warn on invalid enum values Files changed: - web/src/store/common.ts: Add getVisibilityName() helper with validation - web/src/hooks/useMemoFilters.ts: Use getVisibilityName() in visibility filter 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
1 parent 3d893a7 commit 06a0f8d

File tree

2 files changed

+18
-2
lines changed

2 files changed

+18
-2
lines changed

web/src/hooks/useMemoFilters.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { useMemo } from "react";
22
import { instanceStore, userStore } from "@/store";
3-
import { extractUserIdFromName } from "@/store/common";
3+
import { extractUserIdFromName, getVisibilityName } from "@/store/common";
44
import memoFilterStore from "@/store/memoFilter";
55
import { InstanceSetting_Key } from "@/types/proto/api/v1/instance_service_pb";
66
import { Visibility } from "@/types/proto/api/v1/memo_service_pb";
@@ -81,7 +81,8 @@ export const useMemoFilters = (options: UseMemoFiltersOptions = {}): string | un
8181
if (visibilities && visibilities.length > 0) {
8282
// Build visibility filter based on allowed visibility levels
8383
// Format: visibility in ["PUBLIC", "PROTECTED"]
84-
const visibilityValues = visibilities.map((v) => `"${v}"`).join(", ");
84+
// Convert enum values to string names (e.g., 3 -> "PUBLIC", 2 -> "PROTECTED")
85+
const visibilityValues = visibilities.map((v) => `"${getVisibilityName(v)}"`).join(", ");
8586
conditions.push(`visibility in [${visibilityValues}]`);
8687
}
8788

web/src/store/common.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { InstanceSetting_Key } from "@/types/proto/api/v1/instance_service_pb";
2+
import { Visibility } from "@/types/proto/api/v1/memo_service_pb";
23
import { UserSetting_Key } from "@/types/proto/api/v1/user_service_pb";
34

45
export const instanceSettingNamePrefix = "instance/settings/";
@@ -40,3 +41,17 @@ export const getUserSettingKeyName = (key: UserSetting_Key): string => {
4041
export const buildUserSettingName = (username: string, key: UserSetting_Key): string => {
4142
return `${username}/settings/${getUserSettingKeyName(key)}`;
4243
};
44+
45+
// Helper function to convert Visibility enum value to string name
46+
// Used when building filter expressions that require string enum names instead of numeric values
47+
// Example: visibility in ["PUBLIC", "PROTECTED"] instead of visibility in ["3", "2"]
48+
export const getVisibilityName = (visibility: Visibility): string => {
49+
// TypeScript enum reverse mapping: converts numeric value to string name
50+
// e.g., Visibility.PUBLIC (3) -> "PUBLIC"
51+
const name = Visibility[visibility];
52+
if (!name) {
53+
console.warn(`Invalid visibility value: ${visibility}, defaulting to PUBLIC`);
54+
return "PUBLIC";
55+
}
56+
return name;
57+
};

0 commit comments

Comments
 (0)