Skip to content

Commit

Permalink
refactor: Layouts RFC 🎉
Browse files Browse the repository at this point in the history
  • Loading branch information
gfortaine committed Oct 18, 2022
1 parent a873ad9 commit 6e350b2
Show file tree
Hide file tree
Showing 14 changed files with 278 additions and 288 deletions.
14 changes: 8 additions & 6 deletions pages/csr.js → app/csr/page.js
@@ -1,14 +1,16 @@
'use client'

import { Suspense, useEffect, useState } from 'react'

// Client Components
import Page from '../components/page.client'
import Story from '../components/story.client'
import Page from '../../components/page.client'
import Story from '../../components/story.client'

// Utils
import fetchData from '../lib/fetch-data'
import { transform } from '../lib/get-item'
import useData from '../lib/use-data'
import Skeletons from '../components/skeletons'
import fetchData from '../../lib/fetch-data'
import { transform } from '../../lib/get-item'
import useData from '../../lib/use-data'
import Skeletons from '../../components/skeletons'

function StoryWithData({ id }) {
if (typeof window === 'undefined') return <Skeletons />
Expand Down
5 changes: 5 additions & 0 deletions app/item/page.js
@@ -0,0 +1,5 @@
import ItemPage from '../../components/item.server'

export default function Item({ searchParams }) {
return <ItemPage id={searchParams.id} />
}
9 changes: 9 additions & 0 deletions app/layout.js
@@ -0,0 +1,9 @@
export default function RootLayout({ children }) {
return (
<html>
<head />
<body>{children}</body>
</html>
);
}

File renamed without changes.
22 changes: 9 additions & 13 deletions pages/rsc.server.js → app/rsc/page.js
@@ -1,21 +1,21 @@
import { Suspense } from 'react'

// Shared Components
import Skeletons from '../components/skeletons'
import Skeletons from '../../components/skeletons'

// Server Components
import SystemInfo from '../components/server-info.server'
import SystemInfo from '../../components/server-info.server'

// Client Components
import Page from '../components/page.client'
import Story from '../components/story.client'
import Footer from '../components/footer.client'
import ErrorPlaceholder from '../components/error-placeholder.client'
import Page from '../../components/page.client'
import Story from '../../components/story.client'
import Footer from '../../components/footer.client'
import ErrorPlaceholder from '../../components/error-placeholder.client'

// Utils
import fetchData from '../lib/fetch-data'
import { transform } from '../lib/get-item'
import useData from '../lib/use-data'
import fetchData from '../../lib/fetch-data'
import { transform } from '../../lib/get-item'
import useData from '../../lib/use-data'

function StoryWithData({ id }) {
const { data } = useData(`s-${id}`, () => fetchData(`item/${id}`).then(transform))
Expand Down Expand Up @@ -48,7 +48,3 @@ export default function News() {
</Page>
)
}

export const config = {
runtime: 'experimental-edge',
}
20 changes: 8 additions & 12 deletions pages/slow.server.js → app/slow/page.js
@@ -1,18 +1,18 @@
import { Suspense } from 'react'

// Server Components
import SystemInfo from '../components/server-info.server'
import SystemInfo from '../../components/server-info.server'

// Client Components
import Page from '../components/page.client'
import Story from '../components/story.client'
import Footer from '../components/footer.client'
import Page from '../../components/page.client'
import Story from '../../components/story.client'
import Footer from '../../components/footer.client'

// Utils
import fetchData from '../lib/fetch-data'
import { transform } from '../lib/get-item'
import useData from '../lib/use-data'
import Skeletons from '../components/skeletons'
import fetchData from '../../lib/fetch-data'
import { transform } from '../../lib/get-item'
import useData from '../../lib/use-data'
import Skeletons from '../../components/skeletons'

function StoryWithData({ id }) {
const { data } = useData(`s-${id}`, () =>
Expand Down Expand Up @@ -47,7 +47,3 @@ export default function News() {
</Page>
)
}

export const config = {
runtime: 'experimental-edge',
}
33 changes: 33 additions & 0 deletions app/ssr/page.js
@@ -0,0 +1,33 @@
import { experimental_use as use } from 'react'

import Page from '../../components/page.client'
import Story from '../../components/story.client'
import Footer from '../../components/footer.client'

// Utils
import fetchData from '../../lib/fetch-data'
import { transform } from '../../lib/get-item'

async function getData() {
const storyIds = await fetchData('topstories', 2000)
const data = await Promise.all(
storyIds
.slice(0, 30)
.map((id) => fetchData(`item/${id}`).then(transform))
)

return data;
}

export default function News(props) {
const data = use(getData())

return (
<Page>
{data.map((item, i) => {
return <Story key={i} {...item} />
})}
<Footer />
</Page>
);
}
141 changes: 67 additions & 74 deletions components/comment.js
@@ -1,82 +1,75 @@
import React from 'react'
'use client'

import timeAgo from '../lib/time-ago'
import React, { useState } from "react";

export default class Comment extends React.Component {
constructor(props) {
super(props)
this.state = { toggled: false }
this.toggle = this.toggle.bind(this)
}
import timeAgo from "../lib/time-ago";

render() {
const { user, text, date, comments } = this.props
return (
<div className="comment">
<div className="meta">
{/* TODO: time hydration mismatch */}
{user} {timeAgo(new Date(date))} ago{' '}
<span onClick={this.toggle} className="toggle">
{this.state.toggled
? `[+${(this.props.commentsCount || 0) + 1}]`
: '[-]'}
</span>
</div>
export default function Comment({ user, text, date, comments, commentsCount }) {
const [toggled, setToggled] = useState(false)

{this.state.toggled
? null
: [
<div
key="text"
className="text"
dangerouslySetInnerHTML={{ __html: text }}
/>,
<div key="children" className="children">
{comments.map((comment) => (
<Comment key={comment.id} {...comment} />
))}
</div>,
]}
const toggle = () => setToggled(!toggled)

<style jsx>{`
.comment {
padding-top: 15px;
}
.children {
padding-left: 20px;
}
.meta {
font-size: 12px;
margin-bottom: 5px;
}
.toggle {
cursor: pointer;
}
.text {
color: #000;
font-size: 13px;
line-height: 18px;
}
/* hn styles */
.text :global(p) {
margin-top: 10px;
}
.text :global(pre) {
margin-bottom: 10px;
max-width: 900px;
overflow: auto;
padding: 2px;
white-space: pre-wrap;
}
.text :global(a) {
color: #000;
}
`}</style>
return (
<div className="comment">
<div className="meta">
{/* TODO: time hydration mismatch */}
{user} {timeAgo(new Date(date))} ago{' '}
<span onClick={toggle} className="toggle">
{toggled
? `[+${(commentsCount || 0) + 1}]`
: "[-]"}
</span>
</div>
)
}

toggle() {
this.setState({ toggled: !this.state.toggled })
}
{toggled
? null
: [
<div
key="text"
className="text"
dangerouslySetInnerHTML={{ __html: text }}
/>,
<div key="children" className="children">
{comments.map((comment) => (
<Comment key={comment.id} {...comment} />
))}
</div>,
]}

<style jsx>{`
.comment {
padding-top: 15px;
}
.children {
padding-left: 20px;
}
.meta {
font-size: 12px;
margin-bottom: 5px;
}
.toggle {
cursor: pointer;
}
.text {
color: #000;
font-size: 13px;
line-height: 18px;
}
/* hn styles */
.text :global(p) {
margin-top: 10px;
}
.text :global(pre) {
margin-bottom: 10px;
max-width: 900px;
overflow: auto;
padding: 2px;
white-space: pre-wrap;
}
.text :global(a) {
color: #000;
}
`}</style>
</div>
);
}
2 changes: 2 additions & 0 deletions components/story.client.js
@@ -1,3 +1,5 @@
'use client'

import { useState } from 'react'

import timeAgo from '../lib/time-ago'
Expand Down
2 changes: 1 addition & 1 deletion next.config.js
@@ -1,6 +1,6 @@
module.exports = {
experimental: {
appDir: true,
runtime: 'experimental-edge',
serverComponents: true,
},
}
6 changes: 3 additions & 3 deletions package.json
Expand Up @@ -6,8 +6,8 @@
},
"dependencies": {
"ms": "2.1.3",
"next": "12.2.1",
"react": "^18.1.0",
"react-dom": "^18.1.0"
"next": "canary",
"react": "experimental",
"react-dom": "experimental"
}
}
13 changes: 0 additions & 13 deletions pages/item.server.js

This file was deleted.

33 changes: 0 additions & 33 deletions pages/ssr.js

This file was deleted.

0 comments on commit 6e350b2

Please sign in to comment.