Performance optimizations:
- Parallelize getAppOutline and getShareWithMe API calls in useWorkspaceData
- Fix object dependencies in useSync effects to use primitive values
- Remove unnecessary useMemo wrapper in MoreActionsContent
- Fix className whitespace issue in ViewIcon
UI fixes:
- Fix database horizontal scrollbar color in dark mode
- Hide native scrollbar, use custom styled scrollbar component
- Add appflowy-visible-scrollbar and appflowy-hidden-horizontal-scrollbar CSS classes
Add E2E tests for:
- Workspace data loading (parallelized API calls)
- More actions menu rendering
- View icon rendering
* Integrate database blob diff and lazy row loading
* chore: load blob
* chore: fix cell render
* chore: create csv api endpoint
* chore: add test
* chore: fix lint
* chore: add test
* chore: add test
* chore: fix test
* chore: stable scroll test
* chore: fix filter test
* fix: row detail modal more actions menu and add test data-testid
- Fix critical bug in DatabaseRowModal where clicking more actions button
closed the modal instead of opening the dropdown menu (removed erroneous
onClick handler from DropdownMenuTrigger)
- Add data-testid attributes for testing:
- row-detail-more-actions: more actions button
- row-detail-duplicate: duplicate menu item
- row-detail-delete: delete menu item
- row-title-input: row title input field
- Update row-detail-helpers.ts selectors to use new data-testid attributes
- Fix row-detail.cy.ts tests to use correct selectors and test logic
* chore: fix sort
* chore: fix sort
* chore: separate test
* chore: stable test
* chore: fix test
* chore: separate test
* feat: implement drag and drop
* chore: fix scroll to top when insert database at the bottom
* chore: fix scroll
* chore: lint
* fix: test
* fix: shift + left rigit selection
* chore: add test
* chore: fix test
* test: drag and drop image
* chore: selector
* chore: update test with selector
* fix: test
* refactor: paste text and add test for pasting
* fix: paste bullet list with empty line
* chore: lint
* chore: fmt code
* chore: fmt jest test
* chore: fix test
* chore: lint
* chore: fix table
1. Clear old token before processing OAuth callback to prevent axios
interceptor from attempting auto-refresh of expired old token while
processing new OAuth tokens
2. Add multi-stage authentication checks in AppAuthLayer with proper
timeouts to wait for React state sync before triggering logout
3. Add proactive state sync in AppConfig to ensure isAuthenticated
state matches localStorage token on mount
4. Create AppWorkspaceRedirect component to handle /app -> /app/:workspaceId
navigation after OAuth callback, preventing undefined workspace errors