Skip to content

Commit 4eb1393

Browse files
committed
ref the replay stories to use the extracted picked, nuqs, and consistent types that align with nuqs
1 parent 1b3fb62 commit 4eb1393

8 files changed

Lines changed: 137 additions & 143 deletions

File tree

static/app/components/replays/list/__stories__/replayList.stories.tsx

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,22 @@
11
import {useState} from 'react';
22
import {ClassNames} from '@emotion/react';
33
import {useInfiniteQuery} from '@tanstack/react-query';
4+
import {parseAsString, useQueryState} from 'nuqs';
45

56
import {Flex} from '@sentry/scraps/layout';
67

78
import {Hovercard} from 'sentry/components/hovercard';
89
import {ReplayList} from 'sentry/components/replays/list/__stories__/replayList';
910
import {EnvironmentPicker} from 'sentry/components/replays/player/__stories__/environmentPicker';
10-
import {ProjectPicker} from 'sentry/components/replays/player/__stories__/projectPicker';
1111
import * as Storybook from 'sentry/stories';
1212
import {replayListInfiniteApiOptions} from 'sentry/utils/replays/replayListApiOptions';
1313
import {useOrganization} from 'sentry/utils/useOrganization';
1414

1515
export default Storybook.story('ReplayList', story => {
1616
story('Rendered', () => {
1717
const organization = useOrganization();
18-
const [project, setProject] = useState<string | undefined>();
19-
const [environment, setEnvironment] = useState<string | undefined>();
18+
const [project, setProject] = useQueryState('project', parseAsString);
19+
const [environment, setEnvironment] = useQueryState('environment', parseAsString);
2020
const [replayId, setReplayId] = useState<string | undefined>();
2121

2222
const query = {
@@ -38,7 +38,8 @@ export default Storybook.story('ReplayList', story => {
3838
<Flex direction="column" gap="md">
3939
Selected Replay: {replayId}
4040
<Flex gap="sm">
41-
<ProjectPicker project={project} onChange={setProject} />
41+
<Storybook.SelectProject projectSlug={project} setProjectSlug={setProject} />
42+
4243
<EnvironmentPicker
4344
project={project}
4445
environment={environment}
@@ -56,10 +57,8 @@ export default Storybook.story('ReplayList', story => {
5657

5758
story('Hovercard', () => {
5859
const organization = useOrganization();
59-
60-
const [project, setProject] = useState<string | undefined>();
61-
const [environment, setEnvironment] = useState<string | undefined>();
62-
60+
const [project, setProject] = useQueryState('project', parseAsString);
61+
const [environment, setEnvironment] = useQueryState('environment', parseAsString);
6362
const [replayId, setReplayId] = useState<string | undefined>();
6463

6564
const query = {
@@ -84,7 +83,10 @@ export default Storybook.story('ReplayList', story => {
8483
body={
8584
<Flex direction="column" gap="md">
8685
<Flex gap="sm">
87-
<ProjectPicker project={project} onChange={setProject} />
86+
<Storybook.SelectProject
87+
projectSlug={project}
88+
setProjectSlug={setProject}
89+
/>
8890
<EnvironmentPicker
8991
project={project}
9092
environment={environment}

static/app/components/replays/player/__stories__/environmentPicker.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ export function EnvironmentPicker({
1111
onChange,
1212
project,
1313
}: {
14-
environment: string | undefined;
15-
onChange: (environment: string) => void;
16-
project: string | undefined;
14+
environment: string | null | undefined;
15+
onChange: (environment: string | null) => void;
16+
project: string | null;
1717
}) {
1818
const {projects} = useProjects();
1919
const environments = uniq(
@@ -29,14 +29,14 @@ export function EnvironmentPicker({
2929

3030
return (
3131
<CompactSelect
32-
onChange={selected => onChange(selected.value)}
32+
onChange={selected => onChange(selected?.value ?? null)}
3333
options={options}
3434
search
3535
size="xs"
3636
trigger={triggerProps => (
3737
<OverlayTrigger.Button {...triggerProps} prefix="Environment" />
3838
)}
39-
value={environment}
39+
value={environment ?? undefined}
4040
/>
4141
);
4242
}

static/app/components/replays/player/__stories__/projectPicker.tsx

Lines changed: 0 additions & 34 deletions
This file was deleted.

static/app/components/replays/player/__stories__/replaySlugChooser.tsx

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
import {Fragment, useState, type ReactNode} from 'react';
1+
import {Fragment, type ReactNode} from 'react';
22
import {ClassNames} from '@emotion/react';
33
import {useInfiniteQuery} from '@tanstack/react-query';
4+
import {parseAsString, useQueryState} from 'nuqs';
45

56
import {InputGroup} from '@sentry/scraps/input';
67
import {Flex} from '@sentry/scraps/layout';
@@ -9,9 +10,9 @@ import {Text} from '@sentry/scraps/text';
910
import {Hovercard} from 'sentry/components/hovercard';
1011
import {ReplayList} from 'sentry/components/replays/list/__stories__/replayList';
1112
import {EnvironmentPicker} from 'sentry/components/replays/player/__stories__/environmentPicker';
12-
import {ProjectPicker} from 'sentry/components/replays/player/__stories__/projectPicker';
1313
import {Providers} from 'sentry/components/replays/player/__stories__/providers';
1414
import {ReplayLoadingState} from 'sentry/components/replays/player/replayLoadingState';
15+
import * as Storybook from 'sentry/stories';
1516
import {useLoadReplayReader} from 'sentry/utils/replays/hooks/useLoadReplayReader';
1617
import {replayListInfiniteApiOptions} from 'sentry/utils/replays/replayListApiOptions';
1718
import {useOrganization} from 'sentry/utils/useOrganization';
@@ -23,8 +24,8 @@ interface Props {
2324

2425
export function ReplaySlugChooser({children}: Props) {
2526
const organization = useOrganization();
26-
const [project, setProject] = useState<string | undefined>();
27-
const [environment, setEnvironment] = useState<string | undefined>();
27+
const [project, setProject] = useQueryState('project', parseAsString);
28+
const [environment, setEnvironment] = useQueryState('environment', parseAsString);
2829
const [replaySlug, setReplaySlug] = useSessionStorage('stories:replaySlug', '');
2930

3031
const query = {
@@ -44,7 +45,7 @@ export function ReplaySlugChooser({children}: Props) {
4445

4546
const input = (
4647
<Flex direction="row" gap="sm">
47-
<ProjectPicker project={project} onChange={setProject} />
48+
<Storybook.SelectProject projectSlug={project} setProjectSlug={setProject} />
4849
<EnvironmentPicker
4950
project={project}
5051
environment={environment}

static/app/stories/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ export {ColorReference} from './colorReference';
22
export {Demo} from './demo';
33
export {JSXNode, JSXProperty} from './jsx';
44
export {ModuleExports} from './moduleExports';
5-
export {PickProject} from './pickProject';
5+
export {SelectProject, SelectProjects} from './projectPicker';
66
export {PropMatrix} from './props';
77
export {Section} from './layout';
88
export {SideBySide} from './layout';

static/app/stories/pickProject.tsx

Lines changed: 0 additions & 80 deletions
This file was deleted.
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import {useMemo} from 'react';
2+
3+
import {CompactSelect} from '@sentry/scraps/compactSelect';
4+
import {OverlayTrigger} from '@sentry/scraps/overlayTrigger';
5+
6+
import {useProjects} from 'sentry/utils/useProjects';
7+
8+
export function SelectProject({
9+
setProjectSlug,
10+
projectSlug,
11+
}: {
12+
projectSlug: string | null | undefined;
13+
setProjectSlug: (projectSlug: string | null) => void;
14+
}) {
15+
const {projects} = useProjects();
16+
17+
const projectOptions = useMemo(
18+
() => projects.map(p => ({value: p.slug, label: p.slug})),
19+
[projects]
20+
);
21+
22+
return (
23+
<CompactSelect
24+
clearable
25+
onChange={selected => setProjectSlug(selected?.value ?? null)}
26+
options={projectOptions}
27+
search
28+
size="xs"
29+
trigger={triggerProps => (
30+
<OverlayTrigger.Button {...triggerProps} prefix="Project" />
31+
)}
32+
value={projectSlug ?? undefined}
33+
/>
34+
);
35+
}
36+
37+
export function SelectProjects({
38+
setProjectSlugs,
39+
projectSlugs,
40+
}: {
41+
projectSlugs: string[];
42+
setProjectSlugs: (projectSlugs: string[]) => void;
43+
}) {
44+
const {projects} = useProjects();
45+
46+
const projectOptions = useMemo(
47+
() => projects.map(p => ({value: p.slug, label: p.slug})),
48+
[projects]
49+
);
50+
51+
return (
52+
<CompactSelect
53+
clearable
54+
onChange={selected => setProjectSlugs(selected?.map(opt => opt.value) ?? [])}
55+
options={projectOptions}
56+
search
57+
size="xs"
58+
trigger={triggerProps => (
59+
<OverlayTrigger.Button {...triggerProps} prefix="Projects" />
60+
)}
61+
value={projectSlugs ?? undefined}
62+
multiple
63+
/>
64+
);
65+
}

0 commit comments

Comments
 (0)