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>
This commit is contained in:
Steven 2025-12-12 08:03:25 +08:00
parent 3d893a7394
commit 06a0f8d618
2 changed files with 18 additions and 2 deletions

View File

@ -1,6 +1,6 @@
import { useMemo } from "react";
import { instanceStore, userStore } from "@/store";
import { extractUserIdFromName } from "@/store/common";
import { extractUserIdFromName, getVisibilityName } from "@/store/common";
import memoFilterStore from "@/store/memoFilter";
import { InstanceSetting_Key } from "@/types/proto/api/v1/instance_service_pb";
import { Visibility } from "@/types/proto/api/v1/memo_service_pb";
@ -81,7 +81,8 @@ export const useMemoFilters = (options: UseMemoFiltersOptions = {}): string | un
if (visibilities && visibilities.length > 0) {
// Build visibility filter based on allowed visibility levels
// Format: visibility in ["PUBLIC", "PROTECTED"]
const visibilityValues = visibilities.map((v) => `"${v}"`).join(", ");
// Convert enum values to string names (e.g., 3 -> "PUBLIC", 2 -> "PROTECTED")
const visibilityValues = visibilities.map((v) => `"${getVisibilityName(v)}"`).join(", ");
conditions.push(`visibility in [${visibilityValues}]`);
}

View File

@ -1,4 +1,5 @@
import { InstanceSetting_Key } from "@/types/proto/api/v1/instance_service_pb";
import { Visibility } from "@/types/proto/api/v1/memo_service_pb";
import { UserSetting_Key } from "@/types/proto/api/v1/user_service_pb";
export const instanceSettingNamePrefix = "instance/settings/";
@ -40,3 +41,17 @@ export const getUserSettingKeyName = (key: UserSetting_Key): string => {
export const buildUserSettingName = (username: string, key: UserSetting_Key): string => {
return `${username}/settings/${getUserSettingKeyName(key)}`;
};
// Helper function to convert Visibility enum value to string name
// Used when building filter expressions that require string enum names instead of numeric values
// Example: visibility in ["PUBLIC", "PROTECTED"] instead of visibility in ["3", "2"]
export const getVisibilityName = (visibility: Visibility): string => {
// TypeScript enum reverse mapping: converts numeric value to string name
// e.g., Visibility.PUBLIC (3) -> "PUBLIC"
const name = Visibility[visibility];
if (!name) {
console.warn(`Invalid visibility value: ${visibility}, defaulting to PUBLIC`);
return "PUBLIC";
}
return name;
};