Skip to content

Commit 5d92711

Browse files
subirjollySubir Jolly
andauthored
fix: don't remove bucket from selection, if not exists (#3462)
* fix: don't remove bucket from selection, if not exists * chore: add bucket if not exists in bucketlist * chore: add fixme * chore: remove fixme comment * chore: update to have buckets unselectable * chore: remove now extraneous useEffect * chore: update per review Co-authored-by: Subir Jolly <sjolly@influxdata.com>
1 parent 5166057 commit 5d92711

File tree

2 files changed

+56
-32
lines changed

2 files changed

+56
-32
lines changed

src/flows/context/bucket.scoped.tsx

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import React, {
66
useEffect,
77
useState,
88
useMemo,
9+
useRef,
910
} from 'react'
1011

1112
// Contexts
@@ -18,11 +19,13 @@ import {Bucket, RemoteDataState} from 'src/types'
1819
interface BucketContextType {
1920
loading: RemoteDataState
2021
buckets: Bucket[]
22+
addBucket: (_: Bucket) => void
2123
}
2224

2325
const DEFAULT_CONTEXT: BucketContextType = {
2426
loading: RemoteDataState.NotStarted,
2527
buckets: [],
28+
addBucket: (_: Bucket) => {},
2629
}
2730

2831
export const BucketContext = createContext<BucketContextType>(DEFAULT_CONTEXT)
@@ -33,6 +36,18 @@ export const BucketProvider: FC = ({children}) => {
3336
const {getPanelQueries} = useContext(FlowQueryContext)
3437
const {id} = useContext(PipeContext)
3538
const scope = getPanelQueries(id)?.scope ?? {}
39+
const controller = useRef(new AbortController())
40+
41+
useEffect(() => {
42+
return () => {
43+
try {
44+
// Cancelling active query so that there's no memory leak in this component when unmounting
45+
controller.current.abort()
46+
} catch (e) {
47+
// Do nothing
48+
}
49+
}
50+
}, [controller])
3651

3752
useEffect(() => {
3853
if (!scope.region || !scope.org) {
@@ -55,6 +70,7 @@ export const BucketProvider: FC = ({children}) => {
5570
fetch(`${scope.region}/api/v2/buckets?limit=100&orgID=${scope.org}`, {
5671
method: 'GET',
5772
headers,
73+
signal: controller.current.signal,
5874
})
5975
.then(response => {
6076
return response.json()
@@ -117,11 +133,15 @@ export const BucketProvider: FC = ({children}) => {
117133
setBuckets([...bucks.user, ...bucks.system, ...bucks.sample])
118134
})
119135
.catch(() => {})
120-
}, [scope.region, scope.org])
136+
}, [scope.region, scope.org, controller])
137+
138+
const addBucket = (bucket: Bucket) => {
139+
setBuckets([...buckets, bucket])
140+
}
121141

122142
return useMemo(
123143
() => (
124-
<BucketContext.Provider value={{loading, buckets}}>
144+
<BucketContext.Provider value={{loading, buckets, addBucket}}>
125145
{children}
126146
</BucketContext.Provider>
127147
),

src/flows/pipes/QueryBuilder/BucketSelector.tsx

Lines changed: 34 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -3,51 +3,56 @@ import React, {FC, useState, useContext, useEffect} from 'react'
33

44
// Components
55
import {Input, ComponentSize, List, Gradients} from '@influxdata/clockface'
6-
import {RemoteDataState} from 'src/types'
6+
import {Bucket, RemoteDataState} from 'src/types'
77
import BuilderCard from 'src/timeMachine/components/builderCard/BuilderCard'
88
import {BucketContext} from 'src/flows/context/bucket.scoped'
99
import {PipeContext} from 'src/flows/context/pipe'
1010

1111
// this is used by notebooks
1212
const BucketSelector: FC = () => {
1313
const {data, update} = useContext(PipeContext)
14-
const {loading, buckets} = useContext(BucketContext)
14+
const {loading, buckets, addBucket} = useContext(BucketContext)
1515

1616
const [search, setSearch] = useState('')
17+
const [selected, setSelected] = useState(null)
18+
19+
useEffect(() => {
20+
const bucks = data.buckets.filter(b => !!b)
21+
if (!selected && bucks.length) {
22+
setSelected(bucks[0].name)
23+
}
24+
}, [selected, data.buckets])
25+
26+
useEffect(() => {
27+
const allBuckets = new Set(buckets.map(b => b.name))
28+
data.buckets
29+
.filter(b => !allBuckets.has(b.name))
30+
.forEach(b => {
31+
addBucket({
32+
name: b.name,
33+
type: b.type,
34+
} as Bucket)
35+
})
36+
}, [buckets, data.buckets])
1737

1838
const selectBucket = (item?: string): void => {
39+
let bucket
1940
if (!item) {
2041
data.buckets = []
42+
} else if (item !== selected) {
43+
data.buckets = [buckets.find(b => b.name === item)]
44+
bucket = item
2145
} else {
22-
data.buckets = [item]
46+
data.buckets = []
47+
bucket = null
2348
}
2449

2550
data.tags = []
26-
2751
update(data)
28-
}
29-
30-
useEffect(() => {
31-
if (loading !== RemoteDataState.Done) {
32-
return
52+
if (item) {
53+
setSelected(bucket)
3354
}
34-
35-
if (!data.buckets.length) {
36-
return
37-
}
38-
39-
const bucks = buckets.reduce((acc, curr) => {
40-
acc[curr.name] = true
41-
return acc
42-
}, {})
43-
const filtered = data.buckets.filter(b => bucks.hasOwnProperty(b.name))
44-
45-
if (data.buckets.length == filtered.length) {
46-
return
47-
}
48-
49-
selectBucket()
50-
}, [buckets])
55+
}
5156

5257
if (loading === RemoteDataState.Done && !buckets.length) {
5358
return (
@@ -90,9 +95,8 @@ const BucketSelector: FC = () => {
9095
)
9196

9297
const renderListItem = item => {
93-
const selected = !!data.buckets.find(b => b.name === item.name)
94-
95-
const title = selected
98+
const isSelected = selected === item.name
99+
const title = isSelected
96100
? 'Click to remove this filter'
97101
: `Click to filter by ${item.name}`
98102

@@ -104,7 +108,7 @@ const BucketSelector: FC = () => {
104108
value={item.name}
105109
onClick={selectBucket}
106110
title={title}
107-
selected={selected}
111+
selected={isSelected}
108112
size={ComponentSize.ExtraSmall}
109113
gradient={Gradients.GundamPilot}
110114
wrapText={false}

0 commit comments

Comments
 (0)