Skip to content

Commit

Permalink
Light selector optimization
Browse files Browse the repository at this point in the history
Make activities and keyrings selectors avoid recomputing where possible.
  • Loading branch information
Shadowfiend committed Dec 9, 2021
1 parent 91ce518 commit e707cad
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 24 deletions.
24 changes: 10 additions & 14 deletions background/redux-slices/selectors/activitiesSelectors.ts
Original file line number Diff line number Diff line change
@@ -1,27 +1,23 @@
import { createSelector, EntityId } from "@reduxjs/toolkit"
import { AccountState } from "../accounts"
import { UIState } from "../ui"
import { ActivitiesState, ActivityItem } from "../activities"
import { RootState } from ".."
import { ActivityItem } from "../activities"

export const selectCurrentAccountActivitiesWithTimestamps = createSelector(
(state: {
ui: UIState
activities: ActivitiesState
account: AccountState
}) => state,
({ activities, ui, account }) => {
const currentAccountActivities = ui.currentAccount
? activities[ui.currentAccount.address]
(state: RootState) => state.ui.currentAccount?.address,
(state: RootState) => state.activities,
(state: RootState) => state.account.blocks,
(currentAddress, activities, blocks) => {
const currentAccountActivities = currentAddress
? activities[currentAddress]
: undefined
return currentAccountActivities?.ids.map((id: EntityId): ActivityItem => {
const activityItem = currentAccountActivities.entities[id] as ActivityItem
const isSent =
activityItem.from.toLowerCase() === ui.currentAccount?.address
const isSent = activityItem.from.toLowerCase() === currentAddress
return {
...activityItem,
timestamp:
activityItem?.blockHeight &&
account.blocks[activityItem?.blockHeight]?.timestamp,
blocks[activityItem?.blockHeight]?.timestamp,
isSent,
}
})
Expand Down
19 changes: 9 additions & 10 deletions background/redux-slices/selectors/keyringsSelectors.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,19 @@
import { createSelector } from "@reduxjs/toolkit"
import { RootState } from ".."

export const selectIsCurrentAccountSigner = createSelector(
(state: RootState) =>
state.keyrings.keyrings.flatMap((keyring) => keyring.addresses),
(state: RootState) => state.ui.currentAccount,
(addresses, selectedAccount) => addresses.includes(selectedAccount.address)
)

export const selectKeyringStatus = createSelector(
(state: RootState) => state.keyrings.status,
(status) => status
)

export const selectSigningAddresses = createSelector(
(state: RootState) =>
state.keyrings.keyrings.flatMap((keyring) => keyring.addresses),
(addresses) => addresses
(state: RootState) => state.keyrings.keyrings,
(keyrings) => keyrings.flatMap((keyring) => keyring.addresses)
)

export const selectIsCurrentAccountSigner = createSelector(
selectSigningAddresses,
(state: RootState) => state.ui.currentAccount,
(signingAddresses, selectedAccount) =>
signingAddresses.includes(selectedAccount.address)
)

0 comments on commit e707cad

Please sign in to comment.