Skip to content

Commit f9dc2f6

Browse files
committed
Basic posgtres removal + some tests
1 parent d8c2851 commit f9dc2f6

File tree

11 files changed

+8745
-251
lines changed

11 files changed

+8745
-251
lines changed

Diff for: server-components-demo/credentials.js

-7
This file was deleted.

Diff for: server-components-demo/notes/.gitkeep

Whitespace-only changes.

Diff for: server-components-demo/package-lock.json

+8,717-16
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: server-components-demo/package.json

+1-2
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,7 @@
4444
"server:prod": "cross-env NODE_ENV=production nodemon -- --conditions=react-server server",
4545
"bundler:dev": "cross-env NODE_ENV=development nodemon -- scripts/build.js",
4646
"bundler:prod": "cross-env NODE_ENV=production nodemon -- scripts/build.js",
47-
"prettier": "prettier --write **/*.js",
48-
"seed": "node ./scripts/seed.js"
47+
"prettier": "prettier --write **/*.js"
4948
},
5049
"babel": {
5150
"presets": [

Diff for: server-components-demo/scripts/init_db.sh

-13
This file was deleted.

Diff for: server-components-demo/scripts/seed.js

-92
This file was deleted.

Diff for: server-components-demo/server/api.server.js

-76
Original file line numberDiff line numberDiff line change
@@ -21,16 +21,11 @@ babelRegister({
2121
const express = require('express');
2222
const compress = require('compression');
2323
const {readFileSync} = require('fs');
24-
const {unlink, writeFile} = require('fs').promises;
2524
const {pipeToNodeWritable} = require('react-server-dom-webpack/writer');
2625
const path = require('path');
27-
const {Pool} = require('pg');
2826
const React = require('react');
2927
const ReactApp = require('../src/App.server').default;
3028

31-
// Don't keep credentials in the source tree in a real app!
32-
const pool = new Pool(require('../credentials'));
33-
3429
const PORT = 4000;
3530
const app = express();
3631

@@ -93,77 +88,6 @@ app.get('/react', function(req, res) {
9388
sendResponse(req, res, null);
9489
});
9590

96-
const NOTES_PATH = path.resolve(__dirname, '../notes');
97-
98-
app.post(
99-
'/notes',
100-
handleErrors(async function(req, res) {
101-
const now = new Date();
102-
const result = await pool.query(
103-
'insert into notes (title, body, created_at, updated_at) values ($1, $2, $3, $3) returning id',
104-
[req.body.title, req.body.body, now]
105-
);
106-
const insertedId = result.rows[0].id;
107-
await writeFile(
108-
path.resolve(NOTES_PATH, `${insertedId}.md`),
109-
req.body.body,
110-
'utf8'
111-
);
112-
sendResponse(req, res, insertedId);
113-
})
114-
);
115-
116-
app.put(
117-
'/notes/:id',
118-
handleErrors(async function(req, res) {
119-
const now = new Date();
120-
const updatedId = Number(req.params.id);
121-
await pool.query(
122-
'update notes set title = $1, body = $2, updated_at = $3 where id = $4',
123-
[req.body.title, req.body.body, now, updatedId]
124-
);
125-
await writeFile(
126-
path.resolve(NOTES_PATH, `${updatedId}.md`),
127-
req.body.body,
128-
'utf8'
129-
);
130-
sendResponse(req, res, null);
131-
})
132-
);
133-
134-
app.delete(
135-
'/notes/:id',
136-
handleErrors(async function(req, res) {
137-
await pool.query('delete from notes where id = $1', [req.params.id]);
138-
await unlink(path.resolve(NOTES_PATH, `${req.params.id}.md`));
139-
sendResponse(req, res, null);
140-
})
141-
);
142-
143-
app.get(
144-
'/notes',
145-
handleErrors(async function(_req, res) {
146-
const {rows} = await pool.query('select * from notes order by id desc');
147-
res.json(rows);
148-
})
149-
);
150-
151-
app.get(
152-
'/notes/:id',
153-
handleErrors(async function(req, res) {
154-
const {rows} = await pool.query('select * from notes where id = $1', [
155-
req.params.id,
156-
]);
157-
res.json(rows[0]);
158-
})
159-
);
160-
161-
app.get('/sleep/:ms', function(req, res) {
162-
setTimeout(() => {
163-
res.json({ok: true});
164-
}, req.params.ms);
165-
});
166-
16791
app.use(express.static('build'));
16892
app.use(express.static('public'));
16993

Diff for: server-components-demo/src/App.server.js

+3-15
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,9 @@
77
*/
88

99
import {Suspense} from 'react';
10-
1110
import Note from './Note.server';
12-
import NoteList from './NoteList.server';
13-
import EditButton from './EditButton.client';
14-
import SearchField from './SearchField.client';
11+
import NoteManager from './NoteManager.client';
1512
import NoteSkeleton from './NoteSkeleton';
16-
import NoteListSkeleton from './NoteListSkeleton';
1713

1814
export default function App({selectedId, isEditing, searchText}) {
1915
return (
@@ -28,17 +24,9 @@ export default function App({selectedId, isEditing, searchText}) {
2824
alt=""
2925
role="presentation"
3026
/>
31-
<strong>React Notes</strong>
32-
</section>
33-
<section className="sidebar-menu" role="menubar">
34-
<SearchField />
35-
<EditButton noteId={null}>New</EditButton>
27+
<strong>React Server Components Demo</strong>
3628
</section>
37-
<nav>
38-
<Suspense fallback={<NoteListSkeleton />}>
39-
<NoteList searchText={searchText} />
40-
</Suspense>
41-
</nav>
29+
<NoteManager searchText={searchText} />
4230
</section>
4331
<section key={selectedId} className="col note-viewer">
4432
<Suspense fallback={<NoteSkeleton isEditing={isEditing} />}>

Diff for: server-components-demo/src/NoteList.server.js

+1-17
Original file line numberDiff line numberDiff line change
@@ -6,25 +6,9 @@
66
*
77
*/
88

9-
import {fetch} from 'react-fetch';
10-
11-
import {db} from './db.server';
129
import SidebarNote from './SidebarNote';
1310

14-
export default function NoteList({searchText}) {
15-
// const notes = fetch('http://localhost:4000/notes').json();
16-
17-
// WARNING: This is for demo purposes only.
18-
// We don't encourage this in real apps. There are far safer ways to access
19-
// data in a real application!
20-
const notes = db.query(
21-
`select * from notes where title ilike $1 order by id desc`,
22-
['%' + searchText + '%']
23-
).rows;
24-
25-
// Now let's see how the Suspense boundary above lets us not block on this.
26-
// fetch('http://localhost:4000/sleep/3000');
27-
11+
export default function NoteList({notes = [], searchText}) {
2812
return notes.length > 0 ? (
2913
<ul className="notes-list">
3014
{notes.map((note) => (

Diff for: server-components-demo/src/NoteManager.client.js

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import {Suspense, useState} from 'react';
2+
import EditButton from './EditButton.client';
3+
import NoteList from './NoteList.server';
4+
import NoteListSkeleton from './NoteListSkeleton';
5+
import SearchField from './SearchField.client';
6+
7+
export default function NoteManager({searchText}) {
8+
const [notes, setNotes] = useState([]);
9+
10+
return (
11+
<>
12+
<section className="sidebar-menu" role="menubar">
13+
<SearchField />
14+
<EditButton noteId={null}>New</EditButton>
15+
</section>
16+
<nav>
17+
<Suspense fallback={<NoteListSkeleton />}>
18+
<NoteList notes={notes} searchText={searchText} />
19+
</Suspense>
20+
</nav>
21+
</>
22+
);
23+
}

Diff for: server-components-demo/src/db.server.js

-13
This file was deleted.

0 commit comments

Comments
 (0)