1
1
import { Draft , PayloadAction , createAsyncThunk , createSlice } from '@reduxjs/toolkit' ;
2
+ import * as z from 'zod' ;
2
3
3
- import { jsonGet , jsonPost , routes } from '../../actions' ;
4
+ import { adaptFetchError , jsonGet , jsonPost , routes } from '../../actions' ;
4
5
import { baseUrlSelector , codeSelector } from '../../selectors' ;
5
6
import RootState from '../../state' ;
6
7
import { Channel , Edition , Mode } from '../../types' ;
@@ -39,11 +40,12 @@ type PerformGistLoadProps = Pick<
39
40
Exclude < keyof SuccessProps , 'url' | 'code' | 'stdout' | 'stderr' >
40
41
> ;
41
42
42
- interface GistResponseBody {
43
- id : string ;
44
- url : string ;
45
- code : string ;
46
- }
43
+ const GistResponseBody = z . object ( {
44
+ id : z . string ( ) ,
45
+ url : z . string ( ) ,
46
+ code : z . string ( ) ,
47
+ } ) ;
48
+ type GistResponseBody = z . infer < typeof GistResponseBody > ;
47
49
48
50
export const performGistLoad = createAsyncThunk <
49
51
SuccessProps ,
@@ -55,8 +57,9 @@ export const performGistLoad = createAsyncThunk<
55
57
const gistUrl = new URL ( routes . meta . gistLoad , baseUrl ) ;
56
58
const u = new URL ( id , gistUrl ) ;
57
59
58
- const gist = await jsonGet ( u ) ;
59
- return { channel, mode, edition, ...gist } ;
60
+ const d = await adaptFetchError ( ( ) => jsonGet ( u ) ) ;
61
+ const gist = await GistResponseBody . parseAsync ( d ) ;
62
+ return { ...gist , channel, mode, edition, stdout : '' , stderr : '' } ;
60
63
} ) ;
61
64
62
65
export const performGistSave = createAsyncThunk < SuccessProps , void , { state : RootState } > (
@@ -71,8 +74,9 @@ export const performGistSave = createAsyncThunk<SuccessProps, void, { state: Roo
71
74
} ,
72
75
} = state ;
73
76
74
- const json = await jsonPost < GistResponseBody > ( routes . meta . gistSave , { code } ) ;
75
- return { ...json , code, stdout, stderr, channel, mode, edition } ;
77
+ const d = await adaptFetchError ( ( ) => jsonPost ( routes . meta . gistSave , { code } ) ) ;
78
+ const gist = await GistResponseBody . parseAsync ( d ) ;
79
+ return { ...gist , code, stdout, stderr, channel, mode, edition } ;
76
80
} ,
77
81
) ;
78
82
0 commit comments