Open
Conversation
Closed
scutuatua-crypto
approved these changes
Feb 16, 2026
# Conflicts: # shared/constants/init/index.native.tsx # shared/constants/platform-specific/index.desktop.tsx # shared/constants/router2/index.tsx # shared/stores/archive.tsx # shared/stores/config.tsx
* move from box to box2
* try automated perf harness
* rename numbered things back to root
* WIP * WIP
…ontext (#29008) React 19 supports using <Context value={...}> directly instead of <Context.Provider value={...}>. Migrate all context providers to the new syntax and remove the deprecated CanFixOverdrawContext entirely.
* fix copy text clipping
* Replace PopupWrapper and MobilePopup with Modal2 across 17 consumers
Steps 1-2 of modal cleanup: convert all PopupWrapper usages to Modal2
with proper header/onClose patterns. Add popupStyleClipContainer prop
to Modal2 for consumers whose content width differs from the default
400px mode. Convert MobilePopup in join-from-invite to Modal.
* Fix download icon positioning on mobile image/video attachments
Use RNText onPress instead of wrapping in Pressable in Kb.Icon native,
so style props like position/left apply to the actual rendered element.
* Replace direct PopupDialog and MaybePopup uses with Modal2
Step 3 of modal cleanup: convert 7 files that directly used PopupDialog
or MaybePopup to use Modal2 instead. Removes Wrapper shim components
from warning dialogs, converts fullscreen attachment viewer with
popupStyleContainer fill, and migrates proxy settings from
HeaderHocWrapper to Modal2 header.
* Switch ConfirmModal internals from Modal to Modal2
Step 4 of modal cleanup: no consumer changes needed, just swaps the
internal wrapper from deprecated Modal to Modal2.
* Migrate all Kb.Modal consumers to Kb.Modal2 (45 files)
* Remove dead modal components: Modal, PopupWrapper barrel, PopupDialog barrel, MaybePopup
* Add bare prop to Modal2 for router-managed modal screens
The old Modal2 was a bare fragment (header + children + footer with no
wrapping). Our Modal cleanup added PopupDialog/ScrollView wrapping which
broke the 3 pre-existing Modal2 consumers whose router already provides
the outer chrome. bare={true} restores the original behavior.
* Replace HeaderHocWrapper consumers with Modal2 bare
Convert the last 2 HeaderHocWrapper consumers to Modal2 bare and remove
HeaderHocWrapper from barrel exports.
* Delete dead HeaderHocWrapper and header-or-popup
Remove HeaderHocWrapper from header-hoc source files (zero consumers
after barrel export removal) and delete orphaned header-or-popup.tsx.
Clean up unused imports.
* Convert MobilePopup from FloatingBox overlay to BottomSheetModal
Replace the custom FloatingBox+KeyboardAvoidingView+underlay overlay
with @gorhom/bottom-sheet BottomSheetModal, following the same pattern
as FloatingMenu. Add onDismiss prop for swipe-to-dismiss support and
snapPoints for height control. Update all 3 consumers to pass dismiss
callbacks.
* Remove Modal2 wrapper: screens render ModalHeader/ModalFooter directly
- Delete Modal2, PopupDialog, Overlay, MobilePopup components
- Add unified Popup component (desktop/native)
- Router layout defaults modal2=true, provides overlay/close button
- Remove modal2Type system (Wide/SuperWide/etc) — screens set own sizes
- Remove ScrollView from modal chrome — screens manage own scrolling
- Convert all ~100 modal screens to render header/footer directly
* Fix desktop modal layout: sizing, escape key, and lazy-load flash
- Change default modal height from maxHeight to fixed height (560px)
so virtualized lists get a proper parent height
- Add modalStyle to LayoutOptions for per-route size overrides
- Add modalStyle overrides for modals needing non-default dimensions:
deviceAdd (620w), profileEdit (350x450), profileGeneric* (560x485),
profileShowcaseTeamOffer (600x600), teamRename (560x480),
kextPermission (700w), chatAttachmentFullscreen, chatPDF
- Fix fullHeight on modal container to prevent box2_centered collapse
- Replace stack-based EscapeHandler with capture-phase window listener
to ensure Escape always closes the topmost modal
- Move React.Suspense outside ModalWrapper to prevent white box flash
while lazy content loads
* Move modal headers to router getOptions for idiomatic React Navigation
Layout wrappers (desktop + native) now read standard React Navigation
header options (title, headerTitle, headerLeft, headerRight, headerShown)
from getOptions and render ModalHeader. Screens declare headers
declaratively instead of rendering them inline.
Migrated ~25 screens across chat, teams, settings, profile, git, login,
and deeplinks modules. Screens with dynamic/state-dependent headers
remain inline for now. Native layout only renders headers for modal
screens to avoid doubling with RN's native header on regular screens.
* Remove inline headers from modal screens, use native React Navigation headers
- Move header configuration to getOptions in route definitions instead of
rendering HeaderHocHeader/ModalHeader inline in components
- Remove setOptions usage for headers that can be declared at push time
- Add title: '' to modal group defaults to prevent route names leaking as titles
- Move team-building headers to page.tsx using direct zustand store access
- Remove WalletPopup inline headers, use default modal Cancel
- Add skipMobileHeader to signup modal screens with route-level Skip buttons
- Hide native header for screens with custom layouts (emoji picker, attachment titles)
- Delete dead modal-header-props.tsx
- Move account switcher Sign Out button to route getOptions
* Fix headerShown: target attachment fullscreen, not get-titles
* Rename modal2* layout options to cleaner names and add headerShown:false for fs barePreview
- modal2Style → overlayStyle, modal2AvoidTabs → overlayAvoidTabs
- modal2ClearCover → overlayTransparent, modal2NoClose → overlayNoClose
- modal2Footer → modalFooter, modal2Header → modalHeader
- Delete dead modal2 boolean branch and modalContainer style
- Hide native header for fs/barePreview (custom fullscreen layout)
* Migrate static setOptions to getOptions in route definitions
Move header configuration (title, headerLeft, headerRight, headerStyle)
from runtime setOptions calls in screen components to static getOptions
in route definitions. This follows the idiomatic React Navigation pattern
where static header config lives in the route definition rather than
being set imperatively from inside the screen.
Also fixes desktop info panel not opening (StrictMode double-effect
cleanup was calling showInfoPanel(false) on desktop where the panel
is inline), changes default modal height to maxHeight, and adds
modalStyle overrides for routes that used the old modal2Type system.
* initial skills
* Delete modal2.tsx: inline ModalFooter as local styles, inline ModalHeader into consumers
ModalFooter replaced with <Box2> + local modalFooter style definitions
across 37+ screen files. ModalHeader inlined into its 3 remaining
consumers (signup/common, screen-layout.desktop, login/reset/modal,
provision/troubleshooting). Removed ModalFooter, ModalHeader,
useModalHeaderTitleAndCancel, modalFooterStyle, modalFooterNoBorderStyle
from barrel exports.
* Delete PopupHeaderText, Overlay, MobilePopup from barrel exports
PopupHeaderText inlined as styled Text in its 3 consumers.
Overlay and MobilePopup were unused aliases for Popup — removed
from barrel exports.
* Unify popup abstractions: migrate FloatingBox consumers to Popup, move into popup/ directory
- Extend native Popup with Portal mode (attachTo → Portal, no onHidden → Portal, onHidden → BottomSheet)
- Make onHidden optional on Popup; desktop skips positioned chrome when absent
- Migrate FloatingBox consumers to Popup (role-picker, add-alias, emoji-row, suggestors, selection-popup, toast)
- Remove FloatingBox from barrel exports (now internal to popup/)
- Move popup, floating-box, bottom-sheet, use-popup into common-adapters/popup/ directory
* Clean up HeaderHoc: remove HeaderHocHeader, HeaderLeftBlank, internalize LeftAction
* Unify HeaderLeftArrow/Cancel/Cancel2 into single HeaderLeftButton with mode prop
Replaces 4 overlapping header button components with one unified
HeaderLeftButton that accepts mode ('back'|'cancel') and
autoDetectCanGoBack props. Also cleans up dead LeftAction props
from deleted HeaderHocHeader. Renames header-hoc/ to header-buttons.
* Add desktop stub for bottom-sheet (mobile-only module)
* Add extraData to Kb.List usages so LegendList re-renders items on state change
* fix import cycle
* Improve attachment fullscreen ellipsis menu hit area and simplify Icon
- Add padding to the ellipsis icon for a larger click target
- Add windowDraggingClickable to opt out of the Electron drag region
- Simplify desktop Icon: render a single span instead of div+span wrapper
* fix mobile attach flow
* Fix attachment titles dialog missing white background on desktop
* Fix Avatar crash on iOS for big team channel headers
Size 12 isn't a valid Avatar size and was cast as 16, but the native
Avatar's styleCache doesn't have an entry for it, causing a crash.
* Fix bottom sheet not expandable when pulled up
Restore enableDynamicSizing={true} and default snap points to match
the previous FloatingMenu behavior, allowing sheets to grow when
dragged upward.
* Remove orange focus outline from inbox list on desktop
* Fix info panel header styling
* Fix AudioRecorder crash on iOS when entering a thread
Guard recorder.stop() to only run when a recording was actually started,
preventing a SharedObject error on component unmount.
* Fix suggestion list zero height causing LegendList warning
The suggestion list container had maxHeight but no explicit height,
so LegendList's height:100% resolved to 0. Compute a concrete pixel
height from item count capped at 224px.
* Fix source map CSP violation in Electron dev mode
Add webpack: to the connect-src CSP directive so clicking stack trace
links in DevTools resolves source maps instead of showing a CSP error.
* Fix popups showing as positioned overlays instead of bottom sheets on mobile
Pass undefined for attachTo on mobile so Popup uses bottom sheet behavior.
Previously mobile ignored attachTo, but now it respects it, causing menus
and popups to render as positioned overlays instead of bottom sheets.
* WIP
* Fix PDF modal centering and height on desktop
Center all desktop modals in the overlay and override maxHeight for
the PDF viewer so it actually reaches 80% of the viewport.
* Fix chat message popup menu clipped by adjacent messages on desktop
* move skills, add claude
* moved to .claude
* fix useRpc memoizing. team wizard sizing consistent
* Add "Add" button to team builder nav header on mobile
* Fix button waiting spinner centering on mobile and team builder header reactivity
- Wrap mobile button spinner in absolute-positioned View so it centers over the button
- Add HeaderRightUpdater inside TBProvider to drive header updates via setOptions,
fixing the Add button not appearing when users are selected
* Remove FloatingModalContext, replace with mode prop on FloatingMenu
* Replace all 17 imperative nav.setOptions calls with declarative header components
Components now write dynamic state to a new ModalHeaderStore (stores/modal-header.tsx),
and header components in routes.tsx files read from it. This eliminates imperative
header mutations from useEffect and removes setOptions from the useNav() hook entirely.
* Fix team info dialog not dismissing after save
* WIP
* WIP
* Fix FloatingRolePicker styling after FloatingBox→Popup migration
Remove the role picker's own border/shadow since Popup now provides
elevation styling. Remove all floatingContainerStyle position hacks
(relative offsets) that caused see-through gaps inside the Popup wrapper.
* Remove duplicate header from emoji modals, use native headers
The emoji Modal component rendered its own title header on desktop,
duplicating the router-provided header. Remove the custom header and
rely on native headers. Add Cancel button on mobile via HeaderLeftButton.
* Remove duplicate headers and redundant hardcoded sizes from modal components
Modal routes already define title and modalStyle dimensions via the
router. Components were duplicating both, causing double headers and
size conflicts that hid content (e.g. missing Save button in Edit
Profile).
- Remove desktop-only header text from: edit-profile, proofs-list,
showcase-team-offer, add-device
- Remove hardcoded width/height from container styles in: edit-profile,
enter-username, result, proofs-list, showcase-team-offer
- Fix proofs-list flex layout so it fills the modal properly
* Add cancel button to user avatar upload modal header on iOS
* Clear all modals after successfully adding user to team
navigateUp() only popped the add-to-team modal, leaving the search
dialog with a spinner stuck underneath. Use clearModals() instead.
* Fix team showcase modal list overflowing its container on desktop
* Fix phone number prefix container being too narrow on iOS
* Fix destination picker modal content not displaying on desktop
The Move or Copy modal had no explicit height, causing the folder
list to collapse to zero. Add modalStyle with proper dimensions to
the route definition, replacing the old Kb.Modal wrapper sizing.
* Fix device list overlapping header text on desktop sign-in screen
The virtualized list header height was 60px but the actual content
(3 lines of text + padding) needs ~90px, causing items to overlap.
* Enable native navigation headers for logged-out screens on iOS
Remove the custom ModalHeader from SignupScreen and use React Navigation's
native header instead. Add titles to all logged-out route definitions so
they display properly in the nav header.
* default tab nav stuff
* Fix share extension crash on iOS by passing nil for options
The options dictionary in the unsafeBitCast call to UIApplication.open
was causing a crash because iOS internally calls universalLinksOnly on
the options object, which fails on Swift/NSDictionary types. Passing
nil instead lets ObjC nil-messaging safely return false.
* convostate cleanup. claude cleanup * fix lint * fix messageUnchanged dropping isCollapsed and unfurl collapse updates MessagesUpdated events (e.g. from ToggleMessageCollapse) were silently dropped by the messageUnchanged fast-path, which didn't check isCollapsed on messages or compare unfurl content when the unfurl count was unchanged. * fix messageUnchanged missing isEditable, isDeleteable, inlinePaymentSuccessful These fields can change independently via MessagesUpdated without any other content changing, so they must be checked in the fast-path skip. * replace messageUnchanged with in-place mergeMessage using Immer Instead of a fragile field-by-field skip check, merge incoming message fields directly onto the existing draft so Immer's per-property change detection handles re-render granularity automatically. Maps are updated in-place (with deletes) for the same reason. HiddenString gets an equals() method so comparison stays encapsulated without exposing stringValue(). * fix mergeMessage crash when cur is undefined for HiddenString field val.equals(cur as HiddenString) throws if cur is undefined, e.g. when decoratedText is absent on the existing message but present on incoming. Check cur instanceof HiddenString first before calling equals. * fix mergeMessage to resolve fields from both existing and incoming Using only Object.entries(incoming) meant fields present on the existing message but absent from incoming (e.g. submitState: 'pending' on a pending message that gets confirmed) were never cleared. Now iterating the union of both objects' keys so absent-on-incoming fields are correctly set to undefined. * lint -n * normalize empty reactions/unfurls maps to undefined at construction reactionMapToReactions returned new Map([]) when r.reactions was a truthy empty object, and unfurls built an empty Map for empty arrays. Both cases caused mergeMessage to see a reference change where there was no real change. Normalize to undefined so Immer detects no diff. --------- Co-authored-by: chrisnojima <cnojima@keyba.se>
* remove patch * use theme in container correctly
* fs + convostate cleanup (#29012) * fix bugs in teams store - Fix operator precedence in getTeamRowBadgeCount: reset users count was never added to badge total - Fix coerceAssertionRole: ['admin, owner'] was a single string, not two elements, so admin/owner roles were never coerced to writer - Rename dedupAddingMembeers -> dedupAddingMembers (typo) - Remove redundant `as boolean` casts on false literals * simplify chat store: fix logger bug, remove redundant casts, skip no-op updates - Fix onChatSetTeamRetention: logger.error was firing unconditionally even when metas were successfully processed; move into else branch - badgesUpdated: only clear stores with badge > 0 not in new badge list, avoiding O(n) unconditional writes to all conversation stores - updateInboxLayout: skip buildInboxRows when parsed layout is unchanged, preventing redundant full-layout traversal on repeated notifications - Remove 4 redundant `as boolean` casts on boolean literals * simplify config store: merge set calls, fix network change detection, remove dead code * simplify profile store: merge router imports, merge set calls, dedup username fetch * simplify tracker store: remove username alias, fix dead code, deduplicate set calls, cache getState * simplify crypto store: fix double encrypt, remove dead code and misleading comments * simplify provision store: remove dead state, extract cancel helpers, fix double reset * fix lint/tsc: eliminate always-falsy flags, fix optional chain in stores Replace let-flag-set-in-callback patterns (which TypeScript CFA can't track, causing no-unnecessary-condition errors) with .some() checks and size comparisons. Fix prefer-optional-chain in config networkStatus check. * simplify people store: remove dead code, fix O(n²) spreads, single-pass partition Remove debugTodo constant and its unreachable block, drop redundant fullName:undefined default, add maxDate helper to deduplicate max-time logic, replace [...list, item] spreads with push+return (O(n²) → O(n)), replace two filter/reduce passes over data.items with a single partition loop * simplify team-building store: remove dead state, deduplicate work - Remove finishedTeam/SelectedRole/SendNotification state fields (only used transiently inside finishedTeamBuilding; replaced with locals) - Remove serviceResultCount (set but never read) - finishedTeamBuilding: capture values before set() to avoid post-set get() - resetState: remove redundant ...s spread - closeTeamBuilding: pre-compute routeNames at module level - search: merge two reduce passes into one loop - interestingPersonToUser: username shorthand * remove dead serviceResultCount from team-building Props type * simplify archive store: fix type typo, race conditions, unsafe side effect, unify duplicate helpers, prune freshness map * simplify push store: fix Promise anti-pattern, extract token helper, prune dead aliases * simplify signup store: prune dead state/fields, remove restartSignup indirection, fix noErrors double-get * simplify daemon store: batch set calls, inline helpers, remove dead branches * simplify settings store: extract pprof helper, fix setProxyData state, remove spurious undefined arg * simplify users store: merge duplicate imports, batch identity updates, use Object.entries * archive: replace WebCrypto job ID with cross-platform makeUUID crypto.getRandomValues is not reliably available in React Native / Electron / Node contexts. Extract makeUUID into util/uuid so it can be used without stores importing each other, then use it in archive. * WIP * fix lint and tsc: add async to pprof callbacks, add makeUUID import to fs store * fix exploding state * lint hook * remove path * WIP * patch @legendapp/list to fix stale idCache in React 18 concurrent mode In concurrent mode React can render a component multiple times before committing. The isFirstLocal path calls updateItemPositions directly without clearing idCache first, unlike the calculateItemsInView path. On a second render attempt with reordered data, stale idCache entries cause false 'overlapping key' errors. Fix: clear idCache inside updateItemPositions when dataChanged=true. * WIP * clarify uuid.ts comment: seed <= 12 chars, counter <= 4, total <= 16 --------- Co-authored-by: chrisnojima <cnojima@keyba.se>
* small deps updates * fix module.hot not coming in
* optimize chat thread: consolidate subscriptions, flatten separator, prep LegendList
Phase 3: Consolidate WrapperMessage subscriptions (6 → 1 primary + 1 conditional)
- Add hasBeenEdited, hasCoinFlip, hasUnfurlList, hasUnfurlPrompts, textType, showReplyTo
to useMessageData so child components read pre-computed values instead of subscribing
- edited.tsx: remove useChatContext, accept hasBeenEdited as prop
- text/bottom.tsx: remove useChatContext, accept {hasCoinFlip,hasUnfurlList,hasUnfurlPrompts} as props
- text/reply.tsx: useReply(showReplyTo: boolean) — outer subscription eliminated
- text/wrapper.tsx: drop separate textType subscription, use messageData fields
Phase 1 + 6: Consolidate separator subscriptions and flatten tree
- Merge useStateFast + useState into single useSeparatorData hook
- Hoist onAuthorClick, eliminating duplicate useProfileState/useTrackerState calls in LeftSide/TopSide
- Replace ConnectedUsernames with plain Kb.Text
- Inline LeftSide/TopSide into flat SeparatorConnector (eliminates component tree levels)
Phase 2 (partial): EmojiRow subscription bypass
- Accept messageType + hasUnfurls as optional props; when both provided the useChatContext
selector returns constants — no re-renders triggered for those fields
Phase 8: Native/LegendList prep
- Remove removeClippedSubviews and drawDistance (FlashList-only)
- Update estimatedItemSize 100 → 72 (matches ~36px msg + ~24px separator + margin)
- Improve getItemType: check recycleTypeRef first, use baseType directly, isolate
only text/attachment at last index as :pending to avoid wrong-type recycling
* fix: add @ts-ignore for estimatedItemSize on FlatList
* optimize chat thread: pre-compute showUsernameMap in store (phase 4)
Move getUsernameToShow computation out of the render path into syncSeparatorMap,
storing results in showUsernameMap. The separator selector becomes a simple map
lookup instead of running author-collapse logic on every render.
* skip check if no node
* WIP
* restore ConnectedUsernames for colored author names in separator
* immediately update the floating state
* reduce subs
* try and fix big teams button showing
* try fix again
* try fix again
* WIP
* WIP
* remove logging, now fixed
* WIP
* WIP
* add testing
* WIP
* better test to thread
* fix for all flows
---------
Co-authored-by: chrisnojima <cnojima@keyba.se>
* optimize chat thread: consolidate subscriptions, flatten separator, prep LegendList
Phase 3: Consolidate WrapperMessage subscriptions (6 → 1 primary + 1 conditional)
- Add hasBeenEdited, hasCoinFlip, hasUnfurlList, hasUnfurlPrompts, textType, showReplyTo
to useMessageData so child components read pre-computed values instead of subscribing
- edited.tsx: remove useChatContext, accept hasBeenEdited as prop
- text/bottom.tsx: remove useChatContext, accept {hasCoinFlip,hasUnfurlList,hasUnfurlPrompts} as props
- text/reply.tsx: useReply(showReplyTo: boolean) — outer subscription eliminated
- text/wrapper.tsx: drop separate textType subscription, use messageData fields
Phase 1 + 6: Consolidate separator subscriptions and flatten tree
- Merge useStateFast + useState into single useSeparatorData hook
- Hoist onAuthorClick, eliminating duplicate useProfileState/useTrackerState calls in LeftSide/TopSide
- Replace ConnectedUsernames with plain Kb.Text
- Inline LeftSide/TopSide into flat SeparatorConnector (eliminates component tree levels)
Phase 2 (partial): EmojiRow subscription bypass
- Accept messageType + hasUnfurls as optional props; when both provided the useChatContext
selector returns constants — no re-renders triggered for those fields
Phase 8: Native/LegendList prep
- Remove removeClippedSubviews and drawDistance (FlashList-only)
- Update estimatedItemSize 100 → 72 (matches ~36px msg + ~24px separator + margin)
- Improve getItemType: check recycleTypeRef first, use baseType directly, isolate
only text/attachment at last index as :pending to avoid wrong-type recycling
* fix: add @ts-ignore for estimatedItemSize on FlatList
* optimize chat thread: pre-compute showUsernameMap in store (phase 4)
Move getUsernameToShow computation out of the render path into syncSeparatorMap,
storing results in showUsernameMap. The separator selector becomes a simple map
lookup instead of running author-collapse logic on every render.
* optimize chat thread: pre-compute reactionOrderMap, lift text into useMessageData (phases 5-6)
* fix lint/tsc: sort reactionOrderMap key, fix readonly array type, fix unnecessary optional chains
* fix reactionOrderMap: sort by min timestamp using getReactionOrder helper
* fix reactionOrderMap: use getReactionOrder in updateReactions for consistent ordering
---------
Co-authored-by: chrisnojima <cnojima@keyba.se>
Merged
* try tabs absolute for chat transition * opacity --------- Co-authored-by: chrisnojima <cnojima@keyba.se>
* add automated desktop perf test script - run-desktop-perf.js: Playwright CDP script with inbox/thread flows, FPS + long task + memory + React render stats per run, median selection, baseline saving - compare-perf.js: unified comparison for both iOS and desktop baselines (replaces inline Python in run-maestro.sh) - expose window.__perfReact on desktop for aggregate/reset from perf script - add PerfProfiler wrappers to desktop Inbox, Conversation, MessageList components - yarn desktop-perf-thread / desktop-perf-inbox / desktop-perf-compare scripts * unify * WIP * unified perf.json baseline format for iOS and desktop
* dont gen remote actions anymore * directly make actions * ts flow * WIP * WIP * WIP * WIP * WIP * WIP * try new gen (#29044) more cleanups * WIP * WIP * WIP * WIP * WIP * WIP * WIP * WIP * WIP * WIP * WIP * WIP --------- Co-authored-by: chrisnojima <cnojima@keyba.se>
0e8a689 to
c6f0ebe
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.