Fix: memory and context views mobile friendly (#818)

* Changes from fix/memory-and-context-mobile-friendly

* fix: Improve file extension detection and add path traversal protection

* refactor: Extract file extension utilities and add path traversal guards

Code review improvements:
- Extract isMarkdownFilename and isImageFilename to shared image-utils.ts
- Remove duplicated code from context-view.tsx and memory-view.tsx
- Add path traversal guard for context fixture utilities (matching memory)
- Add 7 new tests for context fixture path traversal protection
- Total 61 tests pass

Addresses code review feedback from PR #813

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* test: Add e2e tests for profiles crud and board background persistence

* Update apps/ui/playwright.config.ts

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* fix: Add robust test navigation handling and file filtering

* fix: Format NODE_OPTIONS configuration on single line

* test: Update profiles and board background persistence tests

* test: Replace iPhone 13 Pro with Pixel 5 for mobile test consistency

* Update apps/ui/src/components/views/context-view.tsx

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* chore: Remove test project directory

* feat: Filter context files by type and improve mobile menu visibility

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
This commit is contained in:
gsxdsm
2026-02-26 08:37:33 -08:00
parent 06fa380a6d
commit 25f43f79fa
30 changed files with 3765 additions and 114 deletions

View File

@@ -17,6 +17,12 @@ export const ACCEPTED_TEXT_TYPES = ['text/plain', 'text/markdown', 'text/x-markd
// File extensions for text files (used for validation when MIME type is unreliable)
export const ACCEPTED_TEXT_EXTENSIONS = ['.txt', '.md'];
// File extensions for markdown files
export const MARKDOWN_EXTENSIONS = ['.md', '.markdown'];
// File extensions for image files (used for display filtering)
export const IMAGE_EXTENSIONS = ['.png', '.jpg', '.jpeg', '.gif', '.webp', '.svg', '.bmp'];
// Default max file size (10MB)
export const DEFAULT_MAX_FILE_SIZE = 10 * 1024 * 1024;
@@ -234,3 +240,29 @@ export function getTextFileMimeType(filename: string): string {
}
return 'text/plain';
}
/**
* Check if a filename has a markdown extension
*
* @param filename - The filename to check
* @returns True if the filename has a .md or .markdown extension
*/
export function isMarkdownFilename(filename: string): boolean {
const dotIndex = filename.lastIndexOf('.');
if (dotIndex < 0) return false;
const ext = filename.toLowerCase().substring(dotIndex);
return MARKDOWN_EXTENSIONS.includes(ext);
}
/**
* Check if a filename has an image extension
*
* @param filename - The filename to check
* @returns True if the filename has an image extension
*/
export function isImageFilename(filename: string): boolean {
const dotIndex = filename.lastIndexOf('.');
if (dotIndex < 0) return false;
const ext = filename.toLowerCase().substring(dotIndex);
return IMAGE_EXTENSIONS.includes(ext);
}