├── .gitignore
├── README.md
├── codegen.yml
├── package.json
├── public
├── favicon.ico
├── index.html
├── logo192.png
├── logo512.png
├── manifest.json
└── robots.txt
├── src
├── App.css
├── App.test.tsx
├── App.tsx
├── components
│ ├── LaunchList
│ │ ├── LaunchList.tsx
│ │ ├── index.tsx
│ │ ├── query.ts
│ │ └── styles.css
│ └── LaunchProfile
│ │ ├── LaunchProfile.tsx
│ │ ├── index.tsx
│ │ ├── query.ts
│ │ └── styles.css
├── generated
│ └── graphql.tsx
├── index.css
├── index.tsx
├── logo.svg
├── react-app-env.d.ts
├── reportWebVitals.ts
└── setupTests.ts
├── tsconfig.json
└── yarn.lock
/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.js
7 |
8 | # testing
9 | /coverage
10 |
11 | # production
12 | /build
13 |
14 | # misc
15 | .DS_Store
16 | .env.local
17 | .env.development.local
18 | .env.test.local
19 | .env.production.local
20 |
21 | npm-debug.log*
22 | yarn-debug.log*
23 | yarn-error.log*
24 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | ### [Skilled.dev - Coding Interview Course](https://skilled.dev)
2 | Master the programming interview [Learn More →](https://skilled.dev)
3 |
4 | ### [Software Engineer Resume Builder](https://gitconnected.com/resume-builder)
5 | Effortlessly generate a developer resume. [Learn More →](https://gitconnected.com/resume-builder)
6 |
7 | # React App with GraphQL and TypeScript
8 |
9 | A fully functioning React app using a [GraphQL implemention](https://spacexdata.herokuapp.com/graphql) of the [public SpaceX API](https://docs.spacexdata.com/).
10 |
11 | ## Overview
12 |
13 | - Create React App with the TypeScript setting to bootstrap the App
14 | - Implement React Apollo using React Hooks to make GraphQL queries
15 | - Automatically generate TypeScript types for our queries and components based off the GraphQL schema
16 |
17 | ## Find coding tutorials
18 |
19 | ### [React](https://gitconnected.com/learn/react) | [TypeScript](https://gitconnected.com/learn/typescript) | [GraphQL](https://gitconnected.com/learn/graphql)
20 |
--------------------------------------------------------------------------------
/codegen.yml:
--------------------------------------------------------------------------------
1 | overwrite: true
2 | schema: "https://spacexdata.herokuapp.com/graphql"
3 | documents: "./src/components/**/*.{ts,tsx}"
4 | generates:
5 | src/generated/graphql.tsx:
6 | plugins:
7 | - "typescript"
8 | - "typescript-operations"
9 | - "typescript-react-apollo"
10 | config:
11 | withHooks: true
12 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "graphql-typescript-react",
3 | "version": "0.1.0",
4 | "private": true,
5 | "dependencies": {
6 | "@apollo/client": "^3.4.4",
7 | "@testing-library/jest-dom": "^5.11.4",
8 | "@testing-library/react": "^11.1.0",
9 | "@testing-library/user-event": "^12.1.10",
10 | "@types/jest": "^26.0.15",
11 | "@types/node": "^12.0.0",
12 | "@types/react": "^17.0.0",
13 | "@types/react-dom": "^17.0.0",
14 | "graphql": "^15.5.1",
15 | "react": "^17.0.2",
16 | "react-dom": "^17.0.2",
17 | "react-scripts": "4.0.3",
18 | "typescript": "^4.1.2",
19 | "web-vitals": "^1.0.1"
20 | },
21 | "scripts": {
22 | "start": "react-scripts start",
23 | "build": "react-scripts build",
24 | "test": "react-scripts test",
25 | "eject": "react-scripts eject",
26 | "codegen": "graphql-codegen --config codegen.yml"
27 | },
28 | "eslintConfig": {
29 | "extends": [
30 | "react-app",
31 | "react-app/jest"
32 | ]
33 | },
34 | "browserslist": {
35 | "production": [
36 | ">0.2%",
37 | "not dead",
38 | "not op_mini all"
39 | ],
40 | "development": [
41 | "last 1 chrome version",
42 | "last 1 firefox version",
43 | "last 1 safari version"
44 | ]
45 | },
46 | "devDependencies": {
47 | "@graphql-codegen/cli": "2.0.1",
48 | "@graphql-codegen/typescript-react-apollo": "3.0.0",
49 | "@graphql-codegen/typescript-operations": "2.0.1",
50 | "@graphql-codegen/typescript": "2.0.0"
51 | }
52 | }
--------------------------------------------------------------------------------
/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/treyhuffine/graphql-react-typescript-spacex/d992cd3d9b2c0cbbe0a4c8d2ce11f706857d200e/public/favicon.ico
--------------------------------------------------------------------------------
/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
12 |
13 |
17 |
18 |
27 | React App
28 |
29 |
30 |
31 |
32 |
42 |
43 |
44 |
--------------------------------------------------------------------------------
/public/logo192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/treyhuffine/graphql-react-typescript-spacex/d992cd3d9b2c0cbbe0a4c8d2ce11f706857d200e/public/logo192.png
--------------------------------------------------------------------------------
/public/logo512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/treyhuffine/graphql-react-typescript-spacex/d992cd3d9b2c0cbbe0a4c8d2ce11f706857d200e/public/logo512.png
--------------------------------------------------------------------------------
/public/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "short_name": "React App",
3 | "name": "Create React App Sample",
4 | "icons": [
5 | {
6 | "src": "favicon.ico",
7 | "sizes": "64x64 32x32 24x24 16x16",
8 | "type": "image/x-icon"
9 | },
10 | {
11 | "src": "logo192.png",
12 | "type": "image/png",
13 | "sizes": "192x192"
14 | },
15 | {
16 | "src": "logo512.png",
17 | "type": "image/png",
18 | "sizes": "512x512"
19 | }
20 | ],
21 | "start_url": ".",
22 | "display": "standalone",
23 | "theme_color": "#000000",
24 | "background_color": "#ffffff"
25 | }
26 |
--------------------------------------------------------------------------------
/public/robots.txt:
--------------------------------------------------------------------------------
1 | # https://www.robotstxt.org/robotstxt.html
2 | User-agent: *
3 | Disallow:
4 |
--------------------------------------------------------------------------------
/src/App.css:
--------------------------------------------------------------------------------
1 | .App {
2 | display: flex;
3 | width: 100vw;
4 | height: 100vh;
5 | overflow: hidden;
6 | }
7 |
--------------------------------------------------------------------------------
/src/App.test.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { render, screen } from '@testing-library/react';
3 | import App from './App';
4 |
5 | test('renders learn react link', () => {
6 | render();
7 | const linkElement = screen.getByText(/learn react/i);
8 | expect(linkElement).toBeInTheDocument();
9 | });
10 |
--------------------------------------------------------------------------------
/src/App.tsx:
--------------------------------------------------------------------------------
1 | import * as React from 'react';
2 | import LaunchList from './components/LaunchList';
3 | import LaunchProfile from './components/LaunchProfile';
4 |
5 | import './App.css';
6 |
7 | const App = () => {
8 | const [id, setId] = React.useState(42);
9 | const handleIdChange = React.useCallback((newId) => {
10 | setId(newId);
11 | }, []);
12 |
13 | return (
14 |
15 |
16 |
17 |
18 | );
19 | };
20 |
21 | export default App;
22 |
--------------------------------------------------------------------------------
/src/components/LaunchList/LaunchList.tsx:
--------------------------------------------------------------------------------
1 | import * as React from 'react';
2 | import { LaunchListQuery } from '../../generated/graphql';
3 | import './styles.css';
4 |
5 | export interface OwnProps {
6 | handleIdChange: (newId: number) => void;
7 | }
8 |
9 | interface Props extends OwnProps {
10 | data: LaunchListQuery;
11 | }
12 |
13 | const className = 'LaunchList';
14 |
15 | const LaunchList: React.FC = ({ data, handleIdChange }) => (
16 |
17 |
Launches
18 |
19 | {!!data.launches &&
20 | data.launches.map(
21 | (launch, i) =>
22 | !!launch && (
23 | - handleIdChange(launch.flight_number!)}
27 | >
28 | {launch.mission_name} ({launch.launch_year})
29 |
30 | ),
31 | )}
32 |
33 |
34 | );
35 |
36 | export default LaunchList;
37 |
--------------------------------------------------------------------------------
/src/components/LaunchList/index.tsx:
--------------------------------------------------------------------------------
1 | import * as React from 'react';
2 | import { useLaunchListQuery } from '../../generated/graphql';
3 | import LaunchList, { OwnProps } from './LaunchList';
4 |
5 | const LaunchListContainer: React.FC = (props) => {
6 | const { data, error, loading } = useLaunchListQuery();
7 |
8 | if (loading) {
9 | return Loading...
;
10 | }
11 |
12 | if (error || !data) {
13 | return ERROR
;
14 | }
15 |
16 | return ;
17 | };
18 |
19 | export default LaunchListContainer;
20 |
--------------------------------------------------------------------------------
/src/components/LaunchList/query.ts:
--------------------------------------------------------------------------------
1 | import { gql } from '@apollo/client';
2 |
3 | export const QUERY_LAUNCH_LIST = gql`
4 | query LaunchList {
5 | launches {
6 | flight_number
7 | mission_name
8 | launch_year
9 | }
10 | }
11 | `;
12 |
--------------------------------------------------------------------------------
/src/components/LaunchList/styles.css:
--------------------------------------------------------------------------------
1 | .LaunchList {
2 | height: 100vh;
3 | overflow: hidden auto;
4 | background-color: #ececec;
5 | width: 300px;
6 | padding-left: 20px;
7 | padding-right: 20px;
8 | }
9 |
10 | .LaunchList__list {
11 | list-style: none;
12 | margin: 0;
13 | padding: 0;
14 | }
15 |
16 | .LaunchList__item {
17 | padding-top: 20px;
18 | padding-bottom: 20px;
19 | border-top: 1px solid #919191;
20 | cursor: pointer;
21 | }
22 |
--------------------------------------------------------------------------------
/src/components/LaunchProfile/LaunchProfile.tsx:
--------------------------------------------------------------------------------
1 | import * as React from 'react';
2 | import { LaunchProfileQuery } from '../../generated/graphql';
3 | import './styles.css';
4 |
5 | interface Props {
6 | data: LaunchProfileQuery;
7 | }
8 |
9 | const className = 'LaunchProfile';
10 |
11 | const LaunchProfile: React.FC = ({ data }) => {
12 | if (!data.launch) {
13 | return No launch available
;
14 | }
15 |
16 | return (
17 |
18 |
19 | Flight {data.launch.flight_number}:
20 | {data.launch.launch_success ? (
21 | Success
22 | ) : (
23 | Failed
24 | )}
25 |
26 |
27 | {data.launch.mission_name}
28 | {data.launch.rocket &&
29 | ` (${data.launch.rocket.rocket_name} | ${data.launch.rocket.rocket_type})`}
30 |
31 |
{data.launch.details}
32 | {!!data.launch.links && !!data.launch.links.flickr_images && (
33 |
34 | {data.launch.links.flickr_images.map((image, i) =>
35 | image ? (
36 |

42 | ) : null,
43 | )}
44 |
45 | )}
46 |
47 | );
48 | };
49 |
50 | export default LaunchProfile;
51 |
--------------------------------------------------------------------------------
/src/components/LaunchProfile/index.tsx:
--------------------------------------------------------------------------------
1 | import * as React from 'react';
2 | import { useLaunchProfileQuery } from '../../generated/graphql';
3 | import LaunchProfile from './LaunchProfile';
4 |
5 | interface OwnProps {
6 | id: number;
7 | }
8 |
9 | const LaunchProfileContainer: React.FC = ({ id }) => {
10 | const { data, error, loading, refetch } = useLaunchProfileQuery({
11 | variables: { id: String(id) },
12 | });
13 | React.useEffect(() => {
14 | refetch({ id: String(id) });
15 | }, [refetch, id]);
16 |
17 | if (loading) {
18 | return Loading...
;
19 | }
20 |
21 | if (error) {
22 | return ERROR
;
23 | }
24 |
25 | if (!data) {
26 | return Select a flight from the panel
;
27 | }
28 |
29 | return ;
30 | };
31 |
32 | export default LaunchProfileContainer;
33 |
--------------------------------------------------------------------------------
/src/components/LaunchProfile/query.ts:
--------------------------------------------------------------------------------
1 | import { gql } from '@apollo/client';
2 |
3 | export const QUERY_LAUNCH_PROFILE = gql`
4 | query LaunchProfile($id: String!) {
5 | launch(id: $id) {
6 | flight_number
7 | mission_name
8 | launch_year
9 | launch_success
10 | details
11 | launch_site {
12 | site_name
13 | }
14 | rocket {
15 | rocket_name
16 | rocket_type
17 | }
18 | links {
19 | flickr_images
20 | }
21 | }
22 | }
23 | `;
24 |
--------------------------------------------------------------------------------
/src/components/LaunchProfile/styles.css:
--------------------------------------------------------------------------------
1 | .LaunchProfile {
2 | height: 100vh;
3 | max-height: 100%;
4 | width: calc(100vw - 300px);
5 | overflow: hidden auto;
6 | padding-left: 20px;
7 | padding-right: 20px;
8 | }
9 |
10 | .LaunchProfile__status {
11 | margin-top: 40px;
12 | }
13 |
14 | .LaunchProfile__title {
15 | margin-top: 0;
16 | margin-bottom: 4px;
17 | }
18 |
19 | .LaunchProfile__success {
20 | color: #2cb84b;
21 | }
22 |
23 | .LaunchProfile__failed {
24 | color: #ff695e;
25 | }
26 |
27 | .LaunchProfile__image-list {
28 | display: grid;
29 | grid-gap: 20px;
30 | grid-template-columns: repeat(2, 1fr);
31 | margin-top: 40px;
32 | padding-bottom: 100px;
33 | }
34 |
35 | .LaunchProfile__image {
36 | width: 100%;
37 | }
38 |
--------------------------------------------------------------------------------
/src/generated/graphql.tsx:
--------------------------------------------------------------------------------
1 | import { gql } from '@apollo/client';
2 | import * as Apollo from '@apollo/client';
3 | export type Maybe = T | null;
4 | export type Exact = { [K in keyof T]: T[K] };
5 | export type MakeOptional = Omit & { [SubKey in K]?: Maybe };
6 | export type MakeMaybe = Omit & { [SubKey in K]: Maybe };
7 | const defaultOptions = {}
8 | /** All built-in and custom scalars, mapped to their actual values */
9 | export type Scalars = {
10 | ID: string;
11 | String: string;
12 | Boolean: boolean;
13 | Int: number;
14 | Float: number;
15 | /** The `Upload` scalar type represents a file upload. */
16 | Upload: any;
17 | };
18 |
19 |
20 | export type BasicMission = {
21 | __typename?: 'BasicMission';
22 | name?: Maybe;
23 | flight?: Maybe;
24 | };
25 |
26 | export enum CacheControlScope {
27 | Public = 'PUBLIC',
28 | Private = 'PRIVATE'
29 | }
30 |
31 | export type Capsule = {
32 | __typename?: 'Capsule';
33 | capsule_serial?: Maybe;
34 | capsule_id?: Maybe;
35 | status?: Maybe;
36 | original_launch?: Maybe;
37 | original_launch_unix?: Maybe;
38 | missions?: Maybe>>;
39 | landings?: Maybe;
40 | type?: Maybe;
41 | details?: Maybe;
42 | reuse_count?: Maybe;
43 | };
44 |
45 | export enum CapsuleRange {
46 | Past = 'past',
47 | Upcoming = 'upcoming'
48 | }
49 |
50 | export type Core = {
51 | __typename?: 'Core';
52 | core_serial?: Maybe;
53 | block?: Maybe;
54 | status?: Maybe;
55 | original_launch?: Maybe;
56 | original_launch_unix?: Maybe;
57 | missions?: Maybe>>;
58 | reuse_count?: Maybe;
59 | rtls_attempts?: Maybe;
60 | rtls_landings?: Maybe;
61 | asds_attempts?: Maybe;
62 | asds_landings?: Maybe;
63 | water_landing?: Maybe;
64 | details?: Maybe;
65 | };
66 |
67 | export type Dimension = {
68 | __typename?: 'Dimension';
69 | meters?: Maybe;
70 | feet?: Maybe;
71 | };
72 |
73 | export type Dragon = {
74 | __typename?: 'Dragon';
75 | id?: Maybe;
76 | name?: Maybe;
77 | type?: Maybe;
78 | active?: Maybe;
79 | crew_capacity?: Maybe;
80 | sidewall_angle_deg?: Maybe;
81 | orbit_duration_yr?: Maybe;
82 | dry_mass_kg?: Maybe;
83 | dry_mass_lb?: Maybe;
84 | first_flight?: Maybe;
85 | heat_shield?: Maybe;
86 | thrusters?: Maybe>>;
87 | launch_payload_mass?: Maybe;
88 | launch_payload_vol?: Maybe;
89 | return_payload_mass?: Maybe;
90 | return_payload_vol?: Maybe;
91 | pressurized_capsule?: Maybe;
92 | trunk?: Maybe;
93 | height_w_trunk?: Maybe;
94 | diameter?: Maybe;
95 | wikipedia?: Maybe;
96 | description?: Maybe;
97 | };
98 |
99 | export type Engines = {
100 | __typename?: 'Engines';
101 | number?: Maybe;
102 | type?: Maybe;
103 | version?: Maybe;
104 | layout?: Maybe;
105 | engine_loss_max?: Maybe;
106 | propellant_1?: Maybe;
107 | propellant_2?: Maybe;
108 | thrust_sea_level?: Maybe;
109 | thrust_vacuum?: Maybe;
110 | thrust_to_weight?: Maybe;
111 | };
112 |
113 | export type Fairing = {
114 | __typename?: 'Fairing';
115 | height?: Maybe;
116 | diameter?: Maybe;
117 | };
118 |
119 | export type Headquarters = {
120 | __typename?: 'Headquarters';
121 | address?: Maybe;
122 | city?: Maybe;
123 | state?: Maybe;
124 | };
125 |
126 | export type HeatShield = {
127 | __typename?: 'HeatShield';
128 | material?: Maybe;
129 | size_meters?: Maybe;
130 | temp_degrees?: Maybe;
131 | dev_partner?: Maybe;
132 | };
133 |
134 | export type History = {
135 | __typename?: 'History';
136 | id?: Maybe;
137 | title?: Maybe;
138 | event_date_utc?: Maybe;
139 | event_date_unix?: Maybe;
140 | flight_number?: Maybe;
141 | details?: Maybe;
142 | links?: Maybe;
143 | };
144 |
145 | export type HistoryLinks = {
146 | __typename?: 'HistoryLinks';
147 | article?: Maybe;
148 | reddit?: Maybe;
149 | wikipedia?: Maybe;
150 | };
151 |
152 | export type Info = {
153 | __typename?: 'Info';
154 | name?: Maybe;
155 | founder?: Maybe;
156 | founded?: Maybe;
157 | employees?: Maybe;
158 | vehicles?: Maybe;
159 | launch_sites?: Maybe;
160 | test_sites?: Maybe;
161 | ceo?: Maybe;
162 | cto?: Maybe;
163 | coo?: Maybe;
164 | cto_propulsion?: Maybe;
165 | valuation?: Maybe;
166 | headquarters?: Maybe;
167 | summary?: Maybe;
168 | };
169 |
170 | export type LandingLegs = {
171 | __typename?: 'LandingLegs';
172 | number?: Maybe;
173 | material?: Maybe;
174 | };
175 |
176 | export type Landingpad = {
177 | __typename?: 'Landingpad';
178 | id?: Maybe;
179 | full_name?: Maybe;
180 | status?: Maybe;
181 | location?: Maybe;
182 | landing_type?: Maybe;
183 | attempted_landings?: Maybe;
184 | successful_landings?: Maybe;
185 | wikipedia?: Maybe;
186 | details?: Maybe;
187 | };
188 |
189 | export type Launch = {
190 | __typename?: 'Launch';
191 | flight_number?: Maybe;
192 | mission_id?: Maybe>>;
193 | mission_name?: Maybe;
194 | launch_year?: Maybe;
195 | launch_date_unix?: Maybe;
196 | launch_date_utc?: Maybe;
197 | launch_date_local?: Maybe;
198 | is_tentative?: Maybe;
199 | tentative_max_precision?: Maybe;
200 | tbd?: Maybe;
201 | launch_window?: Maybe;
202 | rocket?: Maybe;
203 | ships?: Maybe>>;
204 | telemetry?: Maybe;
205 | launch_site?: Maybe;
206 | launch_success?: Maybe;
207 | links?: Maybe;
208 | details?: Maybe;
209 | upcoming?: Maybe;
210 | static_fire_date_utc?: Maybe;
211 | static_fire_date_unix?: Maybe;
212 | timeline?: Maybe;
213 | };
214 |
215 | export type LaunchLinks = {
216 | __typename?: 'LaunchLinks';
217 | mission_patch?: Maybe;
218 | mission_patch_small?: Maybe;
219 | reddit_campaign?: Maybe;
220 | reddit_launch?: Maybe;
221 | reddit_recovery?: Maybe;
222 | reddit_media?: Maybe;
223 | presskit?: Maybe;
224 | article_link?: Maybe;
225 | wikipedia?: Maybe;
226 | video_link?: Maybe;
227 | youtube_id?: Maybe;
228 | flickr_images?: Maybe>>;
229 | };
230 |
231 | export enum LaunchRange {
232 | Latest = 'latest',
233 | Next = 'next',
234 | Past = 'past',
235 | Upcoming = 'upcoming'
236 | }
237 |
238 | export type LaunchRocket = {
239 | __typename?: 'LaunchRocket';
240 | rocket_id?: Maybe;
241 | rocket_name?: Maybe;
242 | rocket_type?: Maybe;
243 | first_stage?: Maybe;
244 | second_stage?: Maybe;
245 | fairings?: Maybe;
246 | };
247 |
248 | export type LaunchRocketFairings = {
249 | __typename?: 'LaunchRocketFairings';
250 | reused?: Maybe;
251 | recovery_attempt?: Maybe;
252 | recovered?: Maybe;
253 | ship?: Maybe;
254 | };
255 |
256 | export type LaunchRocketFirstStage = {
257 | __typename?: 'LaunchRocketFirstStage';
258 | cores?: Maybe>>;
259 | };
260 |
261 | export type LaunchRocketFirstStageCore = {
262 | __typename?: 'LaunchRocketFirstStageCore';
263 | core_serial?: Maybe;
264 | flight?: Maybe;
265 | block?: Maybe;
266 | gridfins?: Maybe;
267 | legs?: Maybe;
268 | reused?: Maybe;
269 | land_success?: Maybe;
270 | landing_intent?: Maybe;
271 | landing_type?: Maybe;
272 | landing_vehicle?: Maybe;
273 | };
274 |
275 | export type LaunchRocketSecondStage = {
276 | __typename?: 'LaunchRocketSecondStage';
277 | block?: Maybe;
278 | payloads?: Maybe>>;
279 | };
280 |
281 | export type LaunchSite = {
282 | __typename?: 'LaunchSite';
283 | site_id?: Maybe;
284 | site_name?: Maybe;
285 | site_name_long?: Maybe;
286 | };
287 |
288 | export type LaunchTelemetry = {
289 | __typename?: 'LaunchTelemetry';
290 | flight_club?: Maybe;
291 | };
292 |
293 | export type LaunchTimeline = {
294 | __typename?: 'LaunchTimeline';
295 | webcast_liftoff?: Maybe;
296 | go_for_prop_loading?: Maybe;
297 | rp1_loading?: Maybe;
298 | stage1_rp1_loading?: Maybe;
299 | stage1_lox_loading?: Maybe;
300 | stage2_rp1_loading?: Maybe;
301 | stage2_lox_loading?: Maybe;
302 | engine_chill?: Maybe;
303 | prelaunch_checks?: Maybe;
304 | propellant_pressurization?: Maybe;
305 | go_for_launch?: Maybe;
306 | ignition?: Maybe;
307 | liftoff?: Maybe;
308 | maxq?: Maybe;
309 | beco?: Maybe;
310 | side_core_sep?: Maybe;
311 | side_core_boostback?: Maybe;
312 | meco?: Maybe;
313 | stage_sep?: Maybe;
314 | center_stage_sep?: Maybe;
315 | second_stage_ignition?: Maybe;
316 | center_core_boostback?: Maybe;
317 | fairing_deploy?: Maybe;
318 | first_stage_entry_burn?: Maybe;
319 | side_core_entry_burn?: Maybe;
320 | center_core_entry_burn?: Maybe;
321 | seco_1?: Maybe;
322 | first_stage_landing_burn?: Maybe;
323 | first_stage_landing?: Maybe;
324 | side_core_landing?: Maybe;
325 | center_core_landing?: Maybe;
326 | second_stage_restart?: Maybe;
327 | seco_2?: Maybe;
328 | payload_deploy?: Maybe;
329 | payload_deploy_1?: Maybe;
330 | payload_deploy_2?: Maybe;
331 | dragon_separation?: Maybe;
332 | dragon_solar_deploy?: Maybe;
333 | dragon_bay_door_deploy?: Maybe;
334 | };
335 |
336 | export type Launchpad = {
337 | __typename?: 'Launchpad';
338 | id?: Maybe;
339 | status?: Maybe;
340 | location?: Maybe;
341 | vehicles_launched?: Maybe>>;
342 | attempted_launches?: Maybe;
343 | successful_launches?: Maybe;
344 | wikipedia?: Maybe;
345 | details?: Maybe;
346 | site_id?: Maybe;
347 | site_name_long?: Maybe;
348 | };
349 |
350 | export type Location = {
351 | __typename?: 'Location';
352 | name?: Maybe;
353 | region?: Maybe;
354 | latitude?: Maybe;
355 | longitude?: Maybe;
356 | };
357 |
358 | export type Mass = {
359 | __typename?: 'Mass';
360 | kg?: Maybe;
361 | lb?: Maybe;
362 | };
363 |
364 | export type Mission = {
365 | __typename?: 'Mission';
366 | mission_name?: Maybe;
367 | mission_id?: Maybe;
368 | manufacturers?: Maybe>>;
369 | payload_ids?: Maybe>>;
370 | wikipedia?: Maybe;
371 | website?: Maybe;
372 | twitter?: Maybe;
373 | description?: Maybe;
374 | };
375 |
376 | export enum Order {
377 | Asc = 'asc',
378 | Desc = 'desc'
379 | }
380 |
381 | export type Payload = {
382 | __typename?: 'Payload';
383 | payload_id?: Maybe;
384 | norad_id?: Maybe>>;
385 | cap_serial?: Maybe;
386 | reused?: Maybe;
387 | customers?: Maybe>>;
388 | nationality?: Maybe;
389 | manufacturer?: Maybe;
390 | payload_type?: Maybe;
391 | payload_mass_kg?: Maybe;
392 | payload_mass_lbs?: Maybe;
393 | orbit?: Maybe;
394 | orbit_params?: Maybe;
395 | mass_returned_kg?: Maybe;
396 | mass_returned_lbs?: Maybe;
397 | flight_time_sec?: Maybe