Skip to content

Commit f4a5b3d

Browse files
committed
Rewrite crates reducer with RTK
1 parent 5520927 commit f4a5b3d

File tree

6 files changed

+39
-37
lines changed

6 files changed

+39
-37
lines changed

ui/frontend/.eslintrc.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ module.exports = {
7171
'editor/AceEditor.tsx',
7272
'editor/SimpleEditor.tsx',
7373
'reducers/client.ts',
74+
'reducers/crates.ts',
7475
'reducers/featureFlags.ts',
7576
'reducers/globalConfiguration.ts',
7677
'reducers/output/assembly.ts',

ui/frontend/.prettierignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ node_modules
2222
!editor/AceEditor.tsx
2323
!editor/SimpleEditor.tsx
2424
!reducers/client.ts
25+
!reducers/crates.ts
2526
!reducers/featureFlags.ts
2627
!reducers/globalConfiguration.ts
2728
!reducers/output/assembly.ts

ui/frontend/actions.ts

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ import {
2626
ProcessAssembly,
2727
Position,
2828
makePosition,
29-
Crate,
3029
} from './types';
3130

3231
import { performCommonExecute, wsExecuteRequest } from './reducers/output/execute';
@@ -86,8 +85,6 @@ export enum ActionType {
8685
RequestMacroExpansion = 'REQUEST_MACRO_EXPANSION',
8786
MacroExpansionSucceeded = 'MACRO_EXPANSION_SUCCEEDED',
8887
MacroExpansionFailed = 'MACRO_EXPANSION_FAILED',
89-
RequestCratesLoad = 'REQUEST_CRATES_LOAD',
90-
CratesLoadSucceeded = 'CRATES_LOAD_SUCCEEDED',
9188
NotificationSeen = 'NOTIFICATION_SEEN',
9289
BrowserWidthChanged = 'BROWSER_WIDTH_CHANGED',
9390
}
@@ -379,22 +376,6 @@ export function performMacroExpansion(): ThunkAction {
379376
};
380377
}
381378

382-
const requestCratesLoad = () =>
383-
createAction(ActionType.RequestCratesLoad);
384-
385-
const receiveCratesLoadSuccess = ({ crates }: { crates: Crate[] }) =>
386-
createAction(ActionType.CratesLoadSucceeded, { crates });
387-
388-
export function performCratesLoad(): ThunkAction {
389-
return function(dispatch) {
390-
dispatch(requestCratesLoad());
391-
392-
return jsonGet(routes.meta.crates)
393-
.then(json => dispatch(receiveCratesLoadSuccess(json)));
394-
// TODO: Failure case
395-
};
396-
}
397-
398379
const notificationSeen = (notification: Notification) =>
399380
createAction(ActionType.NotificationSeen, { notification });
400381

@@ -517,8 +498,6 @@ export type Action =
517498
| ReturnType<typeof requestMacroExpansion>
518499
| ReturnType<typeof receiveMacroExpansionSuccess>
519500
| ReturnType<typeof receiveMacroExpansionFailure>
520-
| ReturnType<typeof requestCratesLoad>
521-
| ReturnType<typeof receiveCratesLoadSuccess>
522501
| ReturnType<typeof notificationSeen>
523502
| ReturnType<typeof browserWidthChanged>
524503
| ReturnType<typeof wsExecuteRequest>

ui/frontend/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ import {
1414
gotoPosition,
1515
selectText,
1616
addImport,
17-
performCratesLoad,
1817
reExecuteWithBacktrace,
1918
browserWidthChanged,
2019
} from './actions';
@@ -27,6 +26,7 @@ import { disableSyncChangesToStorage } from './reducers/globalConfiguration';
2726
import Router from './Router';
2827
import configureStore from './configureStore';
2928
import { performVersionsLoad } from './reducers/versions';
29+
import { performCratesLoad } from './reducers/crates';
3030

3131
const store = configureStore(window);
3232

ui/frontend/reducers/crates.ts

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,36 @@
1+
import { createAsyncThunk, createSlice } from '@reduxjs/toolkit';
12
import { sortBy } from 'lodash-es';
3+
import * as z from 'zod';
24

3-
import { Action, ActionType } from '../actions';
5+
import { adaptFetchError, jsonGet, routes } from '../actions';
46
import { Crate } from '../types';
57

6-
const DEFAULT: State = [];
8+
const sliceName = 'crates';
9+
10+
const initialState: State = [];
711

812
export type State = Crate[];
913

10-
export default function crates(state = DEFAULT, action: Action) {
11-
switch (action.type) {
12-
case ActionType.CratesLoadSucceeded:
13-
return sortBy(action.crates, c => c.name);
14-
default:
15-
return state;
16-
}
17-
}
14+
const CratesResponse = z.object({
15+
crates: Crate.array(),
16+
});
17+
type CratesResponse = z.infer<typeof CratesResponse>;
18+
19+
export const performCratesLoad = createAsyncThunk(sliceName, async () => {
20+
const d = await adaptFetchError(() => jsonGet(routes.meta.crates));
21+
const crates = await CratesResponse.parseAsync(d);
22+
return sortBy(crates.crates, (c) => c.name);
23+
});
24+
25+
const slice = createSlice({
26+
name: sliceName,
27+
initialState,
28+
reducers: {},
29+
extraReducers: (builder) => {
30+
builder.addCase(performCratesLoad.fulfilled, (_state, action) => {
31+
return action.payload;
32+
});
33+
},
34+
});
35+
36+
export default slice.reducer;

ui/frontend/types.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,13 @@ export interface Selection {
1515
end?: Position;
1616
}
1717

18-
export interface Crate {
19-
id: string;
20-
name: string;
21-
version: string;
22-
}
18+
export const Crate = z.object({
19+
id: z.string(),
20+
name: z.string(),
21+
version: z.string(),
22+
});
23+
24+
export type Crate = z.infer<typeof Crate>;
2325

2426
export const Version = z.object({
2527
version: z.string(),

0 commit comments

Comments
 (0)