Skip to content

Commit

Permalink
Initial implementation para el otro chat (#6)
Browse files Browse the repository at this point in the history
* Initial implementation para el otro chat

* Remove unused import

* Fix export path ma

* Add notice about new chat
  • Loading branch information
jpadilla committed Aug 1, 2019
1 parent 85b8560 commit 07a5d8f
Show file tree
Hide file tree
Showing 8 changed files with 238 additions and 29 deletions.
89 changes: 68 additions & 21 deletions components/header.js
Expand Up @@ -2,14 +2,26 @@ import Head from 'next/head';
import Link from 'next/link';
import Search from './search';

const TITLE = 'El chat de Telegram';
const DESCRIPTION =
'Las 889 páginas de Telegram entre Rosselló Nevares y sus allegados';
const URL = 'https://telegram-gate.jpadilla.com';
const SHARE_IMAGE_URL = `${URL}/static/share.png`;

const SOURCES = {
original: {
title: 'El chat de Telegram',
description:
'Las 889 páginas de Telegram entre Rosselló Nevares y sus allegados',
url: 'https://telegram-gate.jpadilla.com'
},
otro: {
title: 'El otro chat de Telegram',
description:
'Las 97 páginas de Telegram entre Rosselló Nevares y sus allegados',
url: 'https://telegram-gate.jpadilla.com/el-otro'
}
};

function Header(props) {
let headTitle = TITLE;
let source = SOURCES[props.source || 'original'];
let headTitle = source.title;
let headerStyle = {};
let headerStickyClassNames = '';

Expand All @@ -19,50 +31,85 @@ function Header(props) {
}

if (props.headTitle) {
headTitle = `${props.headTitle} | ${TITLE}`;
headTitle = `${props.headTitle} | ${source.title}`;
}

let linkAs = props.source === 'otro' ? `/el-otro` : `/`;

let linkHref = props.source === 'otro' ? `/el-otro` : `/index`;

return (
<>
<Head>
<title>{headTitle}</title>

<meta name="title" content={headTitle} />
<meta name="description" content={DESCRIPTION} />
<meta name="description" content={source.description} />

<meta property="og:type" content="website" />
<meta property="og:url" content={URL} />
<meta property="og:title" content={headTitle} />
<meta property="og:description" content={DESCRIPTION} />
<meta property="og:description" content={source.description} />
<meta property="og:image" content={SHARE_IMAGE_URL} />

<meta property="twitter:card" content="summary_large_image" />
<meta property="twitter:url" content={URL} />
<meta property="twitter:title" content={headTitle} />
<meta property="twitter:description" content={DESCRIPTION} />
<meta property="twitter:description" content={source.description} />
<meta property="twitter:image" content={SHARE_IMAGE_URL} />

<meta name="viewport" content="initial-scale=1.0, width=device-width" />
</Head>

{props.source !== 'otro' ? (
<div className="mt-2">
<Link href="/el-otro" as="/el-otro">
<a className="font-bold">
<span className="font-black">Nuevo!</span>{' '}
<span className="underline">
Ahora puedes buscar en las 97 páginas más recientes...
</span>
</a>
</Link>
</div>
) : (
''
)}

<div
className={`py-4 mb-4 border-b border-gray-100 top-0 bg-white z-10 ${headerStickyClassNames}`}
style={headerStyle}
>
<h1 className="text-xl text-gray-900">
<Link href="/index" as="/">
<a>{TITLE}</a>
<Link href={linkHref} as={linkAs}>
<a>{source.title}</a>
</Link>
</h1>
<h2 className="text-md text-gray-700">{DESCRIPTION}</h2>
<h2 className="text-md text-gray-700">{source.description}</h2>
<h3 className="text-sm text-gray-600">
Documento original compartido por el{' '}
<a
className="underline"
href="http://periodismoinvestigativo.com/2019/07/las-889-paginas-de-telegram-entre-rossello-nevares-y-sus-allegados/"
>
Centro de Periodismo Investigativo
</a>
.
{props.source === 'otro' ? (
<>
Documento original compartido por{' '}
<a
className="underline"
href="http://enblancoynegromedia.blogspot.com/2019/07/otro-chat-de-telegramgate.html"
>
En Blanco y Negro con Sandra
</a>
.
</>
) : (
<>
Documento original compartido por el{' '}
<a
className="underline"
href="http://periodismoinvestigativo.com/2019/07/las-889-paginas-de-telegram-entre-rossello-nevares-y-sus-allegados/"
>
Centro de Periodismo Investigativo
</a>
.
</>
)}
</h3>
<h4 className="text-xs text-gray-500">
Desarrollado por{' '}
Expand All @@ -78,7 +125,7 @@ function Header(props) {
</a>
</h4>

<Search query={props.query} />
<Search source={props.source} query={props.query} />
</div>
</>
);
Expand Down
12 changes: 10 additions & 2 deletions components/page.js
Expand Up @@ -2,15 +2,23 @@ import Link from 'next/link';
import LazyLoad from 'react-lazy-load';

function Page(props) {
let linkAs = `/page/${props.number}`;
let linkAs =
props.source === 'otro'
? `/el-otro/page/${props.number}`
: `/page/${props.number}`;

let linkHref =
props.source === 'otro'
? `/el-otro/page/[pageNumber]`
: `/page/[pageNumber]`;

if (props.query) {
linkAs = `${linkAs}?q=${props.query}`;
}

return (
<div className="border border-gray-200 bg-gray-200 p-2 mb-4 page-container relative">
<Link href="/page/[pageNumber]" as={linkAs}>
<Link href={linkHref} as={linkAs}>
<a className="block">
<LazyLoad debounce={false} offsetVertical={500}>
<img
Expand Down
2 changes: 1 addition & 1 deletion components/search.js
Expand Up @@ -10,7 +10,7 @@ function Search(props) {
let normalizedQuery = query.trim();

Router.push({
pathname: '/',
pathname: props.source === 'otro' ? '/el-otro' : '/',
query: { q: normalizedQuery }
});
}
Expand Down
4 changes: 1 addition & 3 deletions layouts/main.js
Expand Up @@ -6,9 +6,7 @@ import PropTypes from 'prop-types';
const MainLayout = ({ children }) => (
<div className="container mx-auto px-2 py-4 sm:p-0">
<div className="flex flex-col justify-center">
<div className="container mx-auto max-w-2xl">
{children}
</div>
<div className="container mx-auto max-w-2xl">{children}</div>
</div>
</div>
);
Expand Down
16 changes: 14 additions & 2 deletions next.config.js
Expand Up @@ -6,12 +6,24 @@ module.exports = withCSS({
{ dev, dir, outDir, distDir, buildId }
) {
let paths = {
'/': { page: '/' }
'/': { page: '/' },
'/el-otro': { page: '/el-otro' }
};

for (let i = 0; i < 889; i++) {
let pageNumber = `${i + 1}`;
paths[`/page/${pageNumber}`] = { page: '/page/[pageNumber]', query: { pageNumber } };
paths[`/page/${pageNumber}`] = {
page: '/page/[pageNumber]',
query: { pageNumber }
};
}

for (let i = 0; i < 97; i++) {
let pageNumber = `${i + 1}`;
paths[`/el-otro/page/${pageNumber}`] = {
page: '/el-otro/page/[pageNumber]',
query: { pageNumber }
};
}

return paths;
Expand Down
54 changes: 54 additions & 0 deletions pages/el-otro.js
@@ -0,0 +1,54 @@
import Head from 'next/head';
import Header from '../components/header';
import Page from '../components/page';
import data from '../static/chat-otro.json';

function Home(props) {
return (
<>
<Header source="otro" query={props.query} sticky={true} />
<div className="flex flex-col">
{props.query && props.results.length > 0 && (
<p className="p-4 mb-4 bg-green-500 text-green-800 font-medium">
El término <span className="text-white">"{props.query}"</span> se
encontró en {props.results.length} página(s).
</p>
)}

{props.query && props.results.length === 0 && (
<p className="p-4 mb-4 bg-red-500 text-red-800 font-medium">
No se encontraron resultados para el término{' '}
<span className="text-white">"{props.query}"</span>.
</p>
)}

{props.results.map((result) => (
<Page
source="otro"
key={result.image}
text={result.text}
image={result.image}
number={result.page}
query={props.query}
/>
))}
</div>
</>
);
}

Home.getInitialProps = async function(context) {
let query = context.query.q;
if (query) {
let normalizedQuery = query.toLowerCase();
let results = data.filter((result) =>
result.text.includes(normalizedQuery)
);

return { results, query };
}

return { results: data, query: '' };
};

export default Home;
89 changes: 89 additions & 0 deletions pages/el-otro/page/[pageNumber].js
@@ -0,0 +1,89 @@
import Link from 'next/link';
import { useRouter } from 'next/router';
import Header from '../../../components/header';
import Page from '../../../components/page';
import data from '../../../static/chat-otro.json';

function PageDetail() {
const router = useRouter();
let query = router.query.q;
let pageNumber = router.query.pageNumber;

if (!pageNumber) {
return null;
}

let currentPageNumber = parseInt(router.query.pageNumber);
let previousPageNumber = null;
let nextPageNumber = null;

if (currentPageNumber > 1) {
previousPageNumber = currentPageNumber - 1;
}

if (currentPageNumber < data.length) {
nextPageNumber = currentPageNumber + 1;
}

let result = data.find((result) => result.page === currentPageNumber);

return (
<>
<Header
source="otro"
headTitle={`Página ${result.page}`}
query={query}
sticky={false}
/>
<div className="flex mb-4">
<div className="flex-1 text-left text-gray-800 hover:text-gray-700 bg-gray-200 hover:bg-gray-300">
<Link href="/el-otro/page/[pageNumber]" as={`/el-otro/page/${previousPageNumber}`}>
<a className="block p-2">
<div className="relative">
<div
className="arrow-left absolute left-0"
style={{ top: '5px' }}
/>
<div className="ml-4">
<span className="hidden sm:block">Ver anterior</span>
<span className="sm:hidden block">Anterior</span>
</div>
</div>
</a>
</Link>
</div>
<div className="flex-1 mx-1 text-center">
<span className="block p-2 text-gray-800">
Página {currentPageNumber}
</span>
</div>
<div className="flex-1 text-right bg-gray-200 hover:bg-gray-300">
<Link href="/el-otro/page/[pageNumber]" as={`/el-otro/page/${nextPageNumber}`}>
<a className="block p-2">
<div className="relative">
<div className="mr-4">
<span className="hidden sm:block">Ver próxima</span>
<span className="sm:hidden block">Próxima</span>
</div>
<div
className="arrow-right absolute right-0"
style={{ top: '5px' }}
/>
</div>
</a>
</Link>
</div>
</div>
<div className="flex flex-col">
<Page
source="otro"
text={result.text}
image={result.image}
number={result.page}
/>
</div>
</>
);
}

export default PageDetail;
1 change: 1 addition & 0 deletions static/chat-otro.json

Large diffs are not rendered by default.

0 comments on commit 07a5d8f

Please sign in to comment.