Skip to content

Commit 19a8359

Browse files
committed
Merge pull request #27 from firstcontributions/storybook
2 parents 6d0120c + 4c3b8bc commit 19a8359

25 files changed

+9768
-169
lines changed

.eslintrc.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
},
66
"extends": [
77
"plugin:@typescript-eslint/recommended",
8+
"plugin:storybook/recommended",
89
"next",
910
"next/core-web-vitals",
1011
"prettier"

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,3 +35,6 @@ yarn-error.log*
3535

3636
# typescript
3737
*.tsbuildinfo
38+
39+
#vscode
40+
.vscode

.storybook/RelayStorybook.tsx

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import { ReactNode, useEffect, useState } from 'react'
2+
import { createMockEnvironment, MockPayloadGenerator } from 'relay-test-utils'
3+
4+
import { IEnvironment } from 'relay-runtime'
5+
import RelayEnvironmentProvider from '../src/lib/RelayEnvironmentProvider'
6+
import RelayModernEnvironment from 'relay-runtime/lib/store/RelayModernEnvironment'
7+
8+
type RelayStorybookProps = {
9+
children: ReactNode
10+
mockResolvers?: Record<string, unknown>
11+
}
12+
export const RelayStorybook = ({
13+
children,
14+
mockResolvers = {},
15+
}: RelayStorybookProps) => {
16+
const [environment] = useState(() => createMockEnvironment())
17+
18+
useEffect(() => {
19+
try {
20+
environment.mock.resolveMostRecentOperation((operation) =>
21+
MockPayloadGenerator.generate(operation, mockResolvers)
22+
)
23+
} catch (err) {
24+
// handle no operation
25+
// eslint-disable-next-line
26+
console.log({
27+
err,
28+
})
29+
}
30+
}, [])
31+
32+
return (
33+
<RelayEnvironmentProvider environment={environment}>
34+
{children}
35+
</RelayEnvironmentProvider>
36+
)
37+
}

.storybook/connectionFromArray.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
export const connectionFromArray = <T extends object>(arr: T[] = []) => {
2+
if (!arr || arr.length === 0) {
3+
return {
4+
edges: [],
5+
totalCount: 0,
6+
count: 0,
7+
endCursorOffset: 0,
8+
startCursorOffset: 0,
9+
pageInfo: {
10+
hasNextPage: false,
11+
hasPreviousPage: false,
12+
},
13+
}
14+
}
15+
16+
return {
17+
edges: arr.map((node) => ({ node })),
18+
totalCount: arr.length,
19+
count: arr.length,
20+
endCursorOffset: arr.length,
21+
startCursorOffset: 0,
22+
pageInfo: {
23+
hasNextPage: false,
24+
hasPreviousPage: false,
25+
},
26+
}
27+
}

.storybook/main.js

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
module.exports = {
2+
stories: ['../**/*.stories.mdx', '../**/*.stories.@(js|jsx|ts|tsx)'],
3+
/** Expose public folder to storybook as static */
4+
staticDirs: ['../public'],
5+
addons: [
6+
'@storybook/addon-links',
7+
'@storybook/addon-essentials',
8+
'@storybook/addon-interactions',
9+
'storybook-css-modules-preset',
10+
{
11+
/**
12+
* Fix Storybook issue with PostCSS@8
13+
* @see https://github.com/storybookjs/storybook/issues/12668#issuecomment-773958085
14+
*/
15+
name: '@storybook/addon-postcss',
16+
options: {
17+
postcssLoaderOptions: {
18+
implementation: require('postcss'),
19+
},
20+
},
21+
},
22+
],
23+
framework: '@storybook/react',
24+
core: {
25+
builder: '@storybook/builder-webpack5',
26+
},
27+
}

.storybook/preview.js

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import '../src/styles/globals.css'
2+
import * as NextImage from 'next/image'
3+
4+
const BREAKPOINTS_INT = {
5+
xs: 375,
6+
sm: 600,
7+
md: 900,
8+
lg: 1200,
9+
xl: 1536,
10+
}
11+
12+
const customViewports = Object.fromEntries(
13+
Object.entries(BREAKPOINTS_INT).map(([key, val], idx) => {
14+
console.log(val)
15+
return [
16+
key,
17+
{
18+
name: key,
19+
styles: {
20+
width: `${val}px`,
21+
height: `${(idx + 5) * 10}vh`,
22+
},
23+
},
24+
]
25+
})
26+
)
27+
28+
// Allow Storybook to handle Next's <Image> component
29+
const OriginalNextImage = NextImage.default
30+
31+
Object.defineProperty(NextImage, 'default', {
32+
configurable: true,
33+
value: (props) => <OriginalNextImage {...props} unoptimized />,
34+
})
35+
36+
export const parameters = {
37+
actions: { argTypesRegex: '^on[A-Z].*' },
38+
controls: {
39+
matchers: {
40+
color: /(background|color)$/i,
41+
date: /Date$/,
42+
},
43+
},
44+
viewport: { viewports: customViewports },
45+
}

package.json

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@
1010
"check-lint": "eslint . --ext ts --ext tsx --ext js",
1111
"check-types": "tsc --pretty --noEmit",
1212
"format": "prettier --write .",
13-
"prepare": "husky install"
13+
"prepare": "husky install",
14+
"storybook": "start-storybook -p 3333",
15+
"build-storybook": "build-storybook"
1416
},
1517
"dependencies": {
1618
"@editorjs/code": "^2.7.0",
@@ -41,6 +43,16 @@
4143
"string-strip-html": "^9.1.12"
4244
},
4345
"devDependencies": {
46+
"@babel/core": "^7.18.6",
47+
"@storybook/addon-actions": "^6.5.9",
48+
"@storybook/addon-essentials": "^6.5.9",
49+
"@storybook/addon-interactions": "^6.5.9",
50+
"@storybook/addon-links": "^6.5.9",
51+
"@storybook/addon-postcss": "^2.0.0",
52+
"@storybook/builder-webpack5": "^6.5.9",
53+
"@storybook/manager-webpack5": "^6.5.9",
54+
"@storybook/react": "^6.5.9",
55+
"@storybook/testing-library": "^0.0.13",
4456
"@tailwindcss/typography": "^0.5.2",
4557
"@types/formidable": "^2.0.5",
4658
"@types/multiparty": "^0.0.33",
@@ -52,12 +64,14 @@
5264
"@typescript-eslint/eslint-plugin": "^5.28.0",
5365
"@typescript-eslint/parser": "^5.28.0",
5466
"autoprefixer": "^10.4.2",
67+
"babel-loader": "^8.2.5",
5568
"babel-plugin-relay": "^13.0.2",
5669
"eslint": "^8.18.0",
5770
"eslint-config-next": "12.0.10",
5871
"eslint-config-prettier": "^8.5.0",
5972
"eslint-import-resolver-typescript": "^2.7.1",
6073
"eslint-plugin-prettier": "^4.0.0",
74+
"eslint-plugin-storybook": "^0.5.13",
6175
"graphql": "^16.3.0",
6276
"husky": "^8.0.0",
6377
"lint-staged": "^13.0.2",
@@ -66,6 +80,8 @@
6680
"relay-compiler": "^13.0.2",
6781
"relay-compiler-language-typescript": "^15.0.1",
6882
"relay-config": "^12.0.1",
83+
"relay-test-utils": "^14.0.0",
84+
"storybook-css-modules-preset": "^1.1.1",
6985
"tailwind-scrollbar": "^2.0.1",
7086
"tailwindcss": "^3.0.23",
7187
"typescript": "4.5.5"
@@ -84,5 +100,8 @@
84100
"*.json": [
85101
"prettier --write"
86102
]
103+
},
104+
"resolutions": {
105+
"webpack": "^5"
87106
}
88107
}

src/components/UserDetails/Badges/Badge.tsx

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { graphql, useFragment } from 'react-relay'
22
import { Badge_node$key } from '../../../queries/__generated__/Badge_node.graphql'
33
import BadgeIcon, { LanguageName } from './BadgeIcon'
4-
import Hexagon from './Hexagon'
4+
import Hexagon, { hexagonBackground } from './Hexagon'
55

66
const Badge = ({ badge }: { badge: Badge_node$key }) => {
77
const data = useFragment(
@@ -15,9 +15,16 @@ const Badge = ({ badge }: { badge: Badge_node$key }) => {
1515
badge
1616
)
1717

18+
const getLevelBackground = (level: number) =>
19+
hexagonBackground[
20+
Object.keys(hexagonBackground)[
21+
level - 1
22+
] as keyof typeof hexagonBackground
23+
]
24+
1825
return (
1926
<div className="flex items-center ">
20-
<Hexagon size={36} color="red">
27+
<Hexagon size={4} color={getLevelBackground(data.currentLevel)}>
2128
<BadgeIcon displayName={data.displayName as LanguageName} />
2229
</Hexagon>
2330
<div className=" ml-8 dark:text-gray-300">

src/components/UserDetails/Badges/BadgeIcon.tsx

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,14 @@ export default function BadgeIcon({ displayName }: BadgeIconProps) {
3535
return (
3636
<div className="text-xl z-10 badge-icon">
3737
{iconMap[displayName]}
38-
<style>
38+
<style jsx>
3939
{`
40-
.badge-icon {
41-
color: #00000077;
42-
}
43-
`}
40+
.badge-icon {
41+
padding: 0.5rem;
42+
background: #fff;
43+
border-radius: 50%;
44+
}
45+
`}
4446
</style>
4547
</div>
4648
)

src/components/UserDetails/Badges/BadgeList.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
import { useFragment, graphql, usePaginationFragment } from 'react-relay'
2-
import { Badge_node$data } from '../../../queries/__generated__/Badge_node.graphql'
1+
import { graphql, usePaginationFragment } from 'react-relay'
32
import Badge from './Badge'
43

54
const BadgeList = ({ user }: any) => {

0 commit comments

Comments
 (0)