feat: increase feature parity between mobile and desktop #298
Reference in New Issue
Block a user
Delete Branch "claude/mobile-app-audit-x1ax88"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
Implements task, paper, and file particle views for the mobile app, along with network settings and member management screens. Mirrors desktop functionality while adapting to mobile constraints.
Key Changes
New Particle Views
Network Settings & Member Management
Shared Components & Utilities
Compose & Upload
allowTaskprop to disable in new-stream flowSettings & Account
refreshUsermethod for post-upload user refreshType & API Updates
Humantype with optionalavatar_object_idapiClientwith avatar upload, billing, member management, and invitation endpointsImplementation Details
useIsNetworkAdmincheckhttps://claude.ai/code/session_01LqGPzXQ1AA9CqYHgCgmbtV
Summary by CodeRabbit
Release Notes
New Features
Other Improvements
ℹ️ Recent review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Free
Run ID:
ef160727-8a7c-44b7-9539-db2c2ca1d7ca📥 Commits
Reviewing files that changed from the base of the PR and between
4a73ccad0band9ed1c949fd.📒 Files selected for processing (9)
js/mobile/src/components/Avatar.tsxjs/mobile/src/features/huddle/HuddleScreen.tsxjs/mobile/src/features/networks/Drawer.tsxjs/mobile/src/features/networks/NetworkListScreen.tsxjs/mobile/src/features/settings/AccountScreen.tsxjs/mobile/src/features/stream-view/ReactionStack.tsxjs/mobile/src/features/stream-view/StreamStatusPills.tsxjs/mobile/src/features/stream-view/StreamView.tsxjs/mobile/src/features/streams/StreamCard.tsx🚧 Files skipped from review as they are similar to previous changes (2)
📝 Walkthrough
Walkthrough
This PR adds task particle support (replacing quest), avatar upload/removal with image picker, a shared
MarkdownBodycomponent extracted fromTextParticleView, three new stream particle views (TaskParticleView,PaperParticleView,FileParticleView), aNetworkSettingsScreenwith member management and Stripe billing, network creation and invitation acceptance flows, an expandedSettingsScreenwith email notification preferences, and consolidates avatar display across Huddle, Drawer, and ReactionStack components.Changes
Task Particle Support
js/mobile/src/api/types.ts,js/mobile/src/lib/firestore-particles.tsChecklistItemSchema/TaskPropertiesSchema, replacesquestwithtaskinParticleSchemadiscriminated union andParticlePropertiesMap, and updates FirestorefromFirestoreswitch to parsetaskon thepaperlogic path.js/mobile/src/lib/upload.ts,js/mobile/src/features/compose/ComposeDock.tsx,js/mobile/src/features/compose/TaskComposeSheet.tsx,js/mobile/src/features/streams/NewStreamScreen.tsx,js/mobile/src/features/streams/StreamCard.tsxcreateTaskParticleto Firestore upload helpers; extendsComposeDockwithallowTaskprop,taskOpenstate,submitTaskhandler, andTaskComposeSheetsheet component; disables task button inNewStreamScreen; updatesStreamCardpreview label fromquesttotask.js/mobile/src/features/stream-view/TaskParticleView.tsxTaskParticleViewwith 8-second dwell timer, focus-suspended playback, inline Firestore writes for done/title/notes/checklist/assignee, andChecklistItemRow/AddChecklistItemRow/AssigneeChipsub-components.MarkdownBody and New Particle Views
js/mobile/src/components/MarkdownBody.tsx,js/mobile/src/features/stream-view/TextParticleView.tsxMarkdownBodywith Flowy palette theme, GFM task-list glyph preprocessing, and customRendererfor inline code;TextParticleViewremoves ~159 lines of local markdown setup and delegates toMarkdownBody.js/mobile/src/features/stream-view/PaperParticleView.tsx,js/mobile/src/features/stream-view/FileParticleView.tsx,js/mobile/src/features/stream-view/FallbackParticleView.tsxPaperParticleViewrenders title +MarkdownBodywith length-based dwell timer;FileParticleViewdisplays filename/size with a signed-URL download flow and dwell pause while downloading;FallbackParticleViewsimplified toHelpCircleicon and rawparticle.typelabel.js/mobile/src/features/stream-view/StreamStatusPills.tsx,js/mobile/src/features/stream-view/StreamView.tsxStreamStatusPillscomponent renders conditional paused/closing-in badges;StreamViewaddsrenderParticleswitch cases fortask,paper, andfilewiring the three new view components and relocates status-pill rendering from inline to dedicated component.Avatar Upload and Account/Settings Screens
js/mobile/app.config.ts,js/mobile/package.json,js/mobile/src/api/client.ts,js/mobile/src/api/types.ts,js/mobile/src/hooks/use-avatar-url.ts,js/mobile/src/stores/auth-store.tsexpo-image-pickerdependency andphotosPermissionconfig; addsuploadAvatar/deleteAvatar/getAvatarDownloadUrltoApiClient; addsavatar_object_idtoHumanSchema; addsuseAvatarUrlhook with 1-hour stale time; addsrefreshUsertoAuthStateand its Zustand implementation.js/mobile/src/components/Avatar.tsx,js/mobile/src/features/settings/AccountScreen.tsx,js/mobile/src/features/huddle/HuddleScreen.tsx,js/mobile/src/features/networks/Drawer.tsx,js/mobile/src/features/stream-view/ReactionStack.tsxAvatarcomponent resolves signed URL viauseAvatarUrland rendersImagevs initials with overflow-hidden and expanded sizes;AccountScreenaddspickAndUpload/removeAvatarhandlers with busy state and camera-overlay pressable; HuddleScreen/Drawer/ReactionStack consolidate avatar display using sharedAvatarcomponent.js/mobile/src/features/settings/SettingsScreen.tsxSwitchwith optimistic update/rollback viaapiClient.updateSettings, version display from Expo config, sign-out button with pending state, and localSettingsGrouplayout component.Network Settings, Billing, Members, and Invitations
js/mobile/src/navigation/types.ts,js/mobile/src/navigation/RootNavigator.tsx,js/mobile/src/hooks/use-invitations.ts,js/mobile/src/hooks/use-member-management.ts,js/mobile/src/hooks/use-billing.tsNetworkSettingsin navigation stack; addsuseMyInvitations/useAcceptInvitation/useCreateNetwork,useNetworkInvitations/useAddMembers/useRemoveMember/useRevokeInvitation, and billing hooks with appropriate cache invalidations.js/mobile/src/features/networks/CreateNetworkSheet.tsx,js/mobile/src/features/networks/NetworkListScreen.tsxCreateNetworkSheetbottom sheet for new network naming;NetworkListScreenaddsPlusheader action, concurrent network+invitation refresh,InvitationsSectionwith accept-invitation cards, and updatedEmptyStatewith create button.js/mobile/src/features/network-settings/NetworkSettingsScreen.tsx,js/mobile/src/features/network-settings/AddMembersSheet.tsx,js/mobile/src/features/network-settings/BillingSection.tsx,js/mobile/src/features/networks/Drawer.tsx,js/mobile/src/features/streams/StreamListScreen.tsxNetworkSettingsScreenrenders members with admin remove, pending invitations with revoke, billing, andAddMembersSheet;BillingSectionwithFreeBillingStripe checkout andProBillingportal management;Draweradds Settings row;StreamListScreenadds settings icon navigating toNetworkSettings.Estimated code review effort
🎯 5 (Critical) | ⏱️ ~120 minutes
Poem
Comment
@coderabbitai helpto get the list of available commands and usage tips.