Skip to content
This repository has been archived by the owner on Feb 3, 2025. It is now read-only.

Commit

Permalink
feat: add device chooser
Browse files Browse the repository at this point in the history
  • Loading branch information
irfan-maulana-tkp committed Jan 2, 2021
1 parent 43b6570 commit c90e0f2
Show file tree
Hide file tree
Showing 8 changed files with 3,049 additions and 2,994 deletions.
11 changes: 8 additions & 3 deletions components/ChartTimeline.tsx
Original file line number Diff line number Diff line change
@@ -1,14 +1,19 @@
import React from 'react';
import Chart from 'react-apexcharts';
interface ChartProps {
data: any[];
title: string;
dataKey: string;
}

const ChartTimeline = ({ data, title, dataKey }): React.ReactElement => {
const ChartTimeline = ({ data, title, dataKey }: ChartProps): React.ReactElement => {
const series = [
{
name: 'Mobile',
data: data.map((item) => {
return {
x: item.date,
y: parseInt((item.m[dataKey] * 100).toFixed(0), 10),
y: Math.round(item.m[dataKey] * 100),
};
}),
},
Expand All @@ -17,7 +22,7 @@ const ChartTimeline = ({ data, title, dataKey }): React.ReactElement => {
data: data.map((item) => {
return {
x: item.date,
y: parseInt((item.d[dataKey] * 100).toFixed(0), 10),
y: Math.round(item.d[dataKey] * 100),
};
}),
},
Expand Down
45 changes: 45 additions & 0 deletions components/DeviceChooser.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import React from 'react';

import DesktopIcon from '../components/Icons/Desktop';
import PhoneIcon from '../components/Icons/Phone';

interface DeviceChooserProps {
activeDevice: string;
onChangeDevice: (newDevice: string) => void;
}

const DeviceChooser = ({ activeDevice, onChangeDevice }: DeviceChooserProps): React.ReactElement => {
const handleChangeDevice = (newDevice) => {
onChangeDevice(newDevice);
};

return (
<div className="mt-4 flex">
<div
className={`mr-2 p-2 flex bg-white overflow-hidden rounded-lg ${
activeDevice === 'desktop' ? 'text-green-400 border-green-400 border-2' : 'text-gray-600 border-2'
}`}
onClick={() => {
handleChangeDevice('desktop');
}}
>
<DesktopIcon />
<span className="ml-2">Desktop</span>
</div>

<div
className={`p-2 flex bg-white overflow-hidden rounded-lg ${
activeDevice === 'mobile' ? 'text-green-400 border-green-400 border-2' : 'text-gray-600 border-2'
}`}
onClick={() => {
handleChangeDevice('mobile');
}}
>
<PhoneIcon />
<span className="ml-2">Mobile</span>
</div>
</div>
);
};

export default DeviceChooser;
7 changes: 6 additions & 1 deletion components/FooterSection.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,12 @@ const Footer = (): React.ReactElement => {
</li>

<li>
<a href="https://github.com/mazipan/webperf-ecommerce-id" target="_blank" rel="noopenner noreferrer" className="font-bold">
<a
href="https://github.com/mazipan/webperf-ecommerce-id"
target="_blank"
rel="noopenner noreferrer"
className="font-bold"
>
GitHub
</a>
</li>
Expand Down
2 changes: 1 addition & 1 deletion components/Gauge.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ const textPercentage = (size: string) => {

const ScoreChart = ({ score = 0, variant = 'large' }): React.ReactElement => {
const dashArray = Math.floor(BASE_DASH_ARRAY * score);
const scoreIndex = score * 100;
const scoreIndex = Math.round(score * 100);

const getClassStrokeByScore = (scoreLocal) => {
if (scoreLocal < 0.5) {
Expand Down
28 changes: 2 additions & 26 deletions pages/[id].tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,8 @@ import React, { useState } from 'react';
import { GetStaticProps, GetStaticPaths } from 'next';

import Layout from '../components/Layout';
import DesktopIcon from '../components/Icons/Desktop';
import PhoneIcon from '../components/Icons/Phone';
import CardDetail from '../components/CardDetail';
import DeviceChooser from '../components/DeviceChooser';

import reports from '../reports/output';
import dataEcommerce from '../constants/ecommerce';
Expand All @@ -23,30 +22,7 @@ const DetailPage = ({ data, allData, logo, lastUpdate }): React.ReactElement =>
<h1 className="text-3xl font-bold capitalize">Web Performance Result</h1>
<small className="text-gray-600 text-lg font-bold">Last update {lastUpdate}</small>

<div className="mt-4 flex">
<div
className={`mr-2 p-4 flex bg-white shadow overflow-hidden rounded-lg ${
showDevice === 'desktop' ? '' : 'text-gray-600'
}`}
onClick={() => {
handleChangeDevice('desktop');
}}
>
<DesktopIcon />
<span className="ml-2">Desktop</span>
</div>
<div
className={`p-4 flex bg-white shadow overflow-hidden rounded-lg ${
showDevice === 'mobile' ? '' : 'text-gray-600'
}`}
onClick={() => {
handleChangeDevice('mobile');
}}
>
<PhoneIcon />
<span className="ml-2">Mobile</span>
</div>
</div>
<DeviceChooser activeDevice={showDevice} onChangeDevice={handleChangeDevice} />

<CardDetail data={showDevice === 'desktop' ? data.d : data.m} allData={allData} />
</Layout>
Expand Down
30 changes: 23 additions & 7 deletions pages/index.tsx
Original file line number Diff line number Diff line change
@@ -1,27 +1,43 @@
import React from 'react';
import React, { useState } from 'react';
import { GetStaticProps } from 'next';
import Link from 'next/link';

import dataEcommerce from '../constants/ecommerce';
import { EcommerceItem } from '../types';

import HomeData from '../components/HomeData';
import Layout from '../components/Layout';
import DeviceChooser from '../components/DeviceChooser';

import reports from '../reports/output';
import dataEcommerce from '../constants/ecommerce';
import { EcommerceItem } from '../types';

const Home = ({ lastReport, lastUpdate }): React.ReactElement => {
const [showDevice, setShowDevice] = useState('desktop');
const [sortedReport, setSortedReport] = useState(lastReport);

const handleChangeDevice = (newDevice) => {
setShowDevice(newDevice);
const key = newDevice === 'desktop' ? 'd' : 'm';
const sorted = lastReport.length > 0 ? lastReport.sort((a, b) => b[key].perf - a[key].perf) : [];
setSortedReport(sorted);
};

return (
<Layout>
<h3 className="text-gray-900 text-xl font-bold">Last update {lastUpdate}</h3>

{lastReport.map((item) => (
<DeviceChooser activeDevice={showDevice} onChangeDevice={handleChangeDevice} />

{sortedReport.map((item) => (
<Link href={`/${item.n.toLowerCase()}`} key={item.n}>
<a href={`/${item.n.toLowerCase()}`}>
<div className="mt-4 p-4 bg-white shadow overflow-hidden rounded-lg">
<img className="h-10 w-auto rounded" src={item.logo} alt={item.n} />
<div className="flex justify-start">
<HomeData data={item} title="Desktop" keyNow="d" keyPrev="dPrev" />
<HomeData data={item} title="Mobile" keyNow="m" keyPrev="mPrev" />
{showDevice === 'desktop' ? (
<HomeData data={item} title="Desktop" keyNow="d" keyPrev="dPrev" />
) : (
<HomeData data={item} title="Mobile" keyNow="m" keyPrev="mPrev" />
)}
</div>
</div>
</a>
Expand Down
Loading

1 comment on commit c90e0f2

@vercel
Copy link

@vercel vercel bot commented on c90e0f2 Jan 2, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.