Skip to content

Commit 0974eb5

Browse files
committed
add buttons to swap
1 parent 5f614b8 commit 0974eb5

File tree

7 files changed

+121
-30
lines changed

7 files changed

+121
-30
lines changed

internal/dev_server/sdk/sdk_events.go

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"io"
55
"log"
66
"net/http"
7-
"sync"
87

98
"github.com/launchdarkly/ldcli/internal/dev_server/model"
109
"github.com/pkg/errors"
@@ -22,14 +21,9 @@ func (o sdkEventObserver) Handle(message interface{}) {
2221
o.updateChan <- Message{Event: TYPE_PUT, Data: []byte(str)}
2322
}
2423

25-
var observers *model.Observers
26-
var once sync.Once
24+
var observers *model.Observers = model.NewObservers()
2725

2826
func SdkEventsReceiveHandler(writer http.ResponseWriter, request *http.Request) {
29-
once.Do(func() {
30-
observers = model.NewObservers()
31-
})
32-
3327
bodyStr, err := io.ReadAll(request.Body)
3428
if err != nil {
3529
log.Printf("SdkEventsReceiveHandler: error reading request body: %v", err)
@@ -42,10 +36,6 @@ func SdkEventsReceiveHandler(writer http.ResponseWriter, request *http.Request)
4236
}
4337

4438
func SdkEventsTeeHandler(writer http.ResponseWriter, request *http.Request) {
45-
once.Do(func() {
46-
observers = model.NewObservers()
47-
})
48-
4939
updateChan, errChan := OpenStream(
5040
writer,
5141
request.Context().Done(),

internal/dev_server/ui/src/App.tsx

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import './App.css';
2+
import { useState } from 'react';
3+
import { Box } from '@launchpad-ui/core';
4+
import FlagsButton from './FlagsButton.tsx';
5+
import EventsButton from './EventsButton.tsx';
6+
import FlagsPage from './FlagsPage.tsx';
7+
import EventsPage from './EventsPage.tsx';
8+
9+
function App() {
10+
const [mode, setMode] = useState<'flags' | 'events'>('flags');
11+
12+
return (
13+
<div
14+
style={{
15+
display: 'flex',
16+
justifyContent: 'center',
17+
alignItems: 'center',
18+
padding: '1rem',
19+
}}
20+
>
21+
<Box
22+
display="flex"
23+
flexDirection="column"
24+
alignItems="center"
25+
width="100%"
26+
maxWidth="900px"
27+
minWidth="600px"
28+
padding="2rem"
29+
>
30+
<Box display="flex" gap="10px" justifyContent="flex-start" width="100%">
31+
<FlagsButton onPress={() => { setMode('flags'); }} />
32+
<EventsButton onPress={() => { setMode('events'); }} />
33+
</Box>
34+
<Box padding="1rem" width="100%">
35+
{mode === 'flags' && <FlagsPage />}
36+
{mode === 'events' && <EventsPage />}
37+
</Box>
38+
</Box>
39+
</div>
40+
);
41+
}
42+
43+
44+
export default App;
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import {
2+
Button,
3+
Tooltip,
4+
TooltipTrigger,
5+
} from '@launchpad-ui/components';
6+
import { Icon } from '@launchpad-ui/icons';
7+
import { Inline } from '@launchpad-ui/core';
8+
9+
type Props = {
10+
onPress: () => void;
11+
};
12+
13+
const EventsButton = ({
14+
onPress,
15+
}: Props) => {
16+
return (
17+
<TooltipTrigger>
18+
<Button onPress={onPress}>
19+
<div>
20+
<Inline gap="1">
21+
<Icon name="play" size="small" />
22+
<span>Events</span>
23+
</Inline>
24+
</div>
25+
</Button>
26+
<Tooltip>View events</Tooltip>
27+
</TooltipTrigger>
28+
);
29+
};
30+
31+
export default EventsButton;
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
type Props = {
2+
};
3+
4+
const EventsPage = ({}: Props) => {
5+
return (
6+
<span>events stream</span>
7+
);
8+
};
9+
10+
export default EventsPage;
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import {
2+
Button,
3+
Tooltip,
4+
TooltipTrigger,
5+
} from '@launchpad-ui/components';
6+
import { Icon } from '@launchpad-ui/icons';
7+
import { Inline } from '@launchpad-ui/core';
8+
9+
type Props = {
10+
onPress: () => void;
11+
};
12+
13+
const FlagsButton = ({
14+
onPress,
15+
}: Props) => {
16+
return (
17+
<TooltipTrigger>
18+
<Button onPress={onPress}>
19+
<div>
20+
<Inline gap="1">
21+
<Icon name="flag" size="small" />
22+
<span>Flags</span>
23+
</Inline>
24+
</div>
25+
</Button>
26+
<Tooltip>View and edit flags for the selected project</Tooltip>
27+
</TooltipTrigger>
28+
);
29+
};
30+
31+
export default FlagsButton;

internal/dev_server/ui/src/FlagsPage.tsx

Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -131,24 +131,9 @@ function App() {
131131
);
132132

133133
return (
134-
<div
135-
style={{
136-
display: 'flex',
137-
justifyContent: 'center',
138-
alignItems: 'center',
139-
padding: '1rem',
140-
}}
141-
>
142-
<Box
143-
display="flex"
144-
flexDirection="column"
145-
alignItems="center"
146-
width="100%"
147-
maxWidth="900px"
148-
minWidth="600px"
149-
padding="2rem"
150-
>
151-
<Box display="flex" flexDirection="column" padding="1rem" width="100%">
134+
<div style={{ width: '100%' }}>
135+
<Box width="100%" minWidth="600px">
136+
<Box display="flex" flexDirection="column" width="100%">
152137
{showBanner && (
153138
<Box marginBottom="2rem" width="100%">
154139
<Alert kind="error">

internal/dev_server/ui/src/main.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import React, { useEffect } from 'react';
22
import ReactDOM from 'react-dom/client';
3-
import App from './FlagsPage.tsx';
3+
import App from './App.tsx';
44
import { IconProvider } from './IconProvider.tsx';
55
import { ToastContainer } from '@launchpad-ui/components';
66

0 commit comments

Comments
 (0)