Skip to content

Commit

Permalink
New hook: useColumnData
Browse files Browse the repository at this point in the history
  • Loading branch information
brunolemos committed May 25, 2019
1 parent dab16af commit 1dc4217
Show file tree
Hide file tree
Showing 5 changed files with 86 additions and 142 deletions.
28 changes: 3 additions & 25 deletions packages/components/src/components/columns/ColumnRenderer.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { getLuminance } from 'polished'
import React, { useCallback, useEffect, useRef, useState } from 'react'
import React, { useCallback, useRef, useState } from 'react'
import { Dimensions, View } from 'react-native'

import {
Expand All @@ -19,13 +19,12 @@ import {
ThemeColors,
} from '@devhub/core'
import { useAppViewMode } from '../../hooks/use-app-view-mode'
import { useColumnData } from '../../hooks/use-column-data'
import { useEmitter } from '../../hooks/use-emitter'
import { useReduxAction } from '../../hooks/use-redux-action'
import { useReduxState } from '../../hooks/use-redux-state'
import { useRepoTableColumnWidth } from '../../hooks/use-repo-table-column-width'
import { emitter } from '../../libs/emitter'
import * as actions from '../../redux/actions'
import * as selectors from '../../redux/selectors'
import { sharedStyles } from '../../styles/shared'
import {
columnHeaderHeight,
Expand Down Expand Up @@ -152,10 +151,6 @@ export const ColumnRenderer = React.memo((props: ColumnRendererProps) => {
const columnWidth = useColumnWidth()
const repoTableColumnWidth = useRepoTableColumnWidth()

const filteredSubscriptionsDataSelectorRef = useRef(
selectors.createFilteredSubscriptionsDataSelector(false),
)

const columnRef = useRef<View>(null)
useTheme(theme => {
if (!columnRef.current) return
Expand All @@ -168,12 +163,6 @@ export const ColumnRenderer = React.memo((props: ColumnRendererProps) => {
})
})

useEffect(() => {
filteredSubscriptionsDataSelectorRef.current = selectors.createFilteredSubscriptionsDataSelector(
false,
)
}, column.subscriptionIds)

useEmitter(
'TOGGLE_COLUMN_FILTERS',
payload => {
Expand All @@ -184,18 +173,7 @@ export const ColumnRenderer = React.memo((props: ColumnRendererProps) => {
[column.id, enableSharedFiltersView],
)

const filteredItems = useReduxState(
useCallback(
state => {
return filteredSubscriptionsDataSelectorRef.current(
state,
column.subscriptionIds,
column.filters,
)
},
[column.subscriptionIds, column.filters],
),
)
const { filteredItems } = useColumnData(column.id, false)

const clearableItems = (filteredItems as any[]).filter(
(
Expand Down
38 changes: 5 additions & 33 deletions packages/components/src/containers/EventCardsContainer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import { EventCards, EventCardsProps } from '../components/cards/EventCards'
import { GenericMessageWithButtonView } from '../components/cards/GenericMessageWithButtonView'
import { NoTokenView } from '../components/cards/NoTokenView'
import { ButtonLink } from '../components/common/ButtonLink'
import { useColumnData } from '../hooks/use-column-data'
import { useGitHubAPI } from '../hooks/use-github-api'
import { useReduxAction } from '../hooks/use-redux-action'
import { useReduxState } from '../hooks/use-redux-state'
Expand Down Expand Up @@ -87,43 +88,14 @@ export const EventCardsContainer = React.memo(
selectors.createSubscriptionsDataSelector(),
)

const filteredSubscriptionsDataSelectorRef = useRef(
selectors.createFilteredSubscriptionsDataSelector(
cardViewMode !== 'compact',
),
)

useEffect(() => {
subscriptionsDataSelectorRef.current = selectors.createSubscriptionsDataSelector()
filteredSubscriptionsDataSelectorRef.current = selectors.createFilteredSubscriptionsDataSelector(
cardViewMode !== 'compact',
)
}, [cardViewMode, ...column.subscriptionIds])

const allItems = useReduxState(
useCallback(
state => {
return subscriptionsDataSelectorRef.current(
state,
column.subscriptionIds,
)
},
[column.subscriptionIds, column.filters],
),
) as EnhancedGitHubEvent[]

const filteredItems = useReduxState(
useCallback(
state => {
return filteredSubscriptionsDataSelectorRef.current(
state,
column.subscriptionIds,
column.filters,
)
},
[column.subscriptionIds, column.filters],
),
) as EnhancedGitHubEvent[]
const { allItems, filteredItems } = useColumnData<EnhancedGitHubEvent>(
column.id,
cardViewMode !== 'compact',
)

const clearedAt = column.filters && column.filters.clearedAt
const olderDate = getOlderEventDate(allItems)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import React, { useCallback, useEffect, useRef } from 'react'
import React, { useCallback } from 'react'

import {
EnhancedGitHubIssueOrPullRequest,
Expand All @@ -17,6 +17,7 @@ import {
} from '../components/cards/IssueOrPullRequestCards'
import { NoTokenView } from '../components/cards/NoTokenView'
import { ButtonLink } from '../components/common/ButtonLink'
import { useColumnData } from '../hooks/use-column-data'
import { useGitHubAPI } from '../hooks/use-github-api'
import { useReduxAction } from '../hooks/use-redux-action'
import { useReduxState } from '../hooks/use-redux-state'
Expand Down Expand Up @@ -87,47 +88,9 @@ export const IssueOrPullRequestCardsContainer = React.memo(
actions.fetchColumnSubscriptionRequest,
)

const subscriptionsDataSelectorRef = useRef(
selectors.createSubscriptionsDataSelector(),
)

const filteredSubscriptionsDataSelectorRef = useRef(
selectors.createFilteredSubscriptionsDataSelector(
cardViewMode !== 'compact',
),
)

useEffect(() => {
subscriptionsDataSelectorRef.current = selectors.createSubscriptionsDataSelector()
filteredSubscriptionsDataSelectorRef.current = selectors.createFilteredSubscriptionsDataSelector(
cardViewMode !== 'compact',
)
}, [cardViewMode, ...column.subscriptionIds])

const allItems = useReduxState(
useCallback(
state => {
return (subscriptionsDataSelectorRef.current(
state,
column.subscriptionIds,
) as any) as EnhancedGitHubIssueOrPullRequest[]
},
[column.subscriptionIds, column.filters],
),
)

const filteredItems = useReduxState(
useCallback(
state => {
return (filteredSubscriptionsDataSelectorRef.current(
state,
column.subscriptionIds,
column.filters,
) as any) as EnhancedGitHubIssueOrPullRequest[]
},
[column.subscriptionIds, column.filters],
),
)
const { allItems, filteredItems } = useColumnData<
EnhancedGitHubIssueOrPullRequest
>(column.id, cardViewMode !== 'compact')

const clearedAt = column.filters && column.filters.clearedAt
const olderDate = getOlderIssueOrPullRequestDate(allItems)
Expand Down
47 changes: 5 additions & 42 deletions packages/components/src/containers/NotificationCardsContainer.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import React, { useCallback, useEffect, useRef } from 'react'
import React, { useCallback } from 'react'

import {
EnhancedGitHubNotification,
Expand All @@ -12,6 +12,7 @@ import {
NotificationCardsProps,
} from '../components/cards/NotificationCards'
import { NoTokenView } from '../components/cards/NoTokenView'
import { useColumnData } from '../hooks/use-column-data'
import { useReduxAction } from '../hooks/use-redux-action'
import { useReduxState } from '../hooks/use-redux-state'
import * as actions from '../redux/actions'
Expand Down Expand Up @@ -53,47 +54,9 @@ export const NotificationCardsContainer = React.memo(
actions.fetchColumnSubscriptionRequest,
)

const subscriptionsDataSelectorRef = useRef(
selectors.createSubscriptionsDataSelector(),
)

const filteredSubscriptionsDataSelectorRef = useRef(
selectors.createFilteredSubscriptionsDataSelector(
cardViewMode !== 'compact',
),
)

useEffect(() => {
subscriptionsDataSelectorRef.current = selectors.createSubscriptionsDataSelector()
filteredSubscriptionsDataSelectorRef.current = selectors.createFilteredSubscriptionsDataSelector(
cardViewMode !== 'compact',
)
}, [cardViewMode, ...column.subscriptionIds])

const allItems = useReduxState(
useCallback(
state => {
return subscriptionsDataSelectorRef.current(
state,
column.subscriptionIds,
)
},
[column.subscriptionIds, column.filters],
),
) as EnhancedGitHubNotification[]

const filteredItems = useReduxState(
useCallback(
state => {
return filteredSubscriptionsDataSelectorRef.current(
state,
column.subscriptionIds,
column.filters,
)
},
[column.subscriptionIds, column.filters],
),
) as EnhancedGitHubNotification[]
const { allItems, filteredItems } = useColumnData<
EnhancedGitHubNotification
>(column.id, cardViewMode !== 'compact')

const clearedAt = column.filters && column.filters.clearedAt
const olderDate = getOlderNotificationDate(allItems)
Expand Down
68 changes: 68 additions & 0 deletions packages/components/src/hooks/use-column-data.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
import _ from 'lodash'
import { useCallback, useEffect, useRef } from 'react'

import { EnhancedItem } from '@devhub/core'
import * as selectors from '../redux/selectors'
import { useReduxState } from './use-redux-state'

export function useColumnData<ItemT extends EnhancedItem>(
columnId: string,
mergeSimilar: boolean,
) {
const subscriptionsDataSelectorRef = useRef(
selectors.createSubscriptionsDataSelector(),
)

const filteredSubscriptionsDataSelectorRef = useRef(
selectors.createFilteredSubscriptionsDataSelector(mergeSimilar),
)

const column = useReduxState(
useCallback(state => selectors.columnSelector(state, columnId), [columnId]),
)

useEffect(() => {
subscriptionsDataSelectorRef.current = selectors.createSubscriptionsDataSelector()
filteredSubscriptionsDataSelectorRef.current = selectors.createFilteredSubscriptionsDataSelector(
mergeSimilar,
)
}, [column && column.subscriptionIds && column.subscriptionIds.join(',')])

const allItems = useReduxState(
useCallback(
state => {
if (!column) return []

return subscriptionsDataSelectorRef.current(
state,
column.subscriptionIds,
)
},
[
column && column.subscriptionIds && column.subscriptionIds.join(','),
column && column.filters,
],
),
) as ItemT[]

const filteredItems = useReduxState(
useCallback(
state => {
if (!column) return []

return filteredSubscriptionsDataSelectorRef.current(
state,
column.subscriptionIds,
column.filters,
)
},
[column && column.subscriptionIds, column && column.filters],
),
) as ItemT[]

return {
allItems,
column,
filteredItems,
}
}

0 comments on commit 1dc4217

Please sign in to comment.