Refactor node packages to yarn workspaces & ditch next.js for CRA. (#161)

* chore: restructure project into yarn workspaces, remove next

* fix tests, remove webapp from terraform

* remove more ui deployment bits

* remove pages, fix FUNDING.yml

* remove isomorphism

* remove next providers

* fix linting issues

* feat: start basis of new web ui system on CRA

* chore: move types to @roleypoly/types package

* chore: move src/common/utils to @roleypoly/misc-utils

* chore: remove roleypoly/ path remappers

* chore: renmove vercel config

* chore: re-add worker-types to api package

* chore: fix type linting scope for api

* fix(web): craco should include all of packages dir

* fix(ci): change api webpack path for wrangler

* chore: remove GAR actions from CI

* chore: update codeql job

* chore: test better github dar matcher in lint-staged
This commit is contained in:
41666 2021-03-12 18:04:49 -05:00 committed by GitHub
parent 49e308507e
commit 2ff6588030
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
328 changed files with 16624 additions and 3525 deletions

View file

@ -0,0 +1,68 @@
import * as React from 'react';
import { mediaQueryDefs } from './Breakpoints';
import { BreakpointContext, ScreenSize } from './Context';
const resetScreen: ScreenSize = {
onSmallScreen: false,
onTablet: false,
onDesktop: false,
};
export class BreakpointsProvider extends React.Component<{}, ScreenSize> {
public state = {
...resetScreen,
onSmallScreen: true,
};
private mediaQueries: { [key in keyof ScreenSize]: MediaQueryList } = {
onSmallScreen: window.matchMedia(
mediaQueryDefs.onSmallScreen.replace('@media screen and', '')
),
onTablet: window.matchMedia(
mediaQueryDefs.onTablet.replace('@media screen and', '')
),
onDesktop: window.matchMedia(
mediaQueryDefs.onDesktop.replace('@media screen and', '')
),
};
componentDidMount() {
Object.entries(this.mediaQueries).forEach(([key, mediaQuery]) =>
mediaQuery.addEventListener('change', this.handleMediaEvent)
);
}
componentWillUnmount() {
Object.entries(this.mediaQueries).forEach(([key, mediaQuery]) =>
mediaQuery.removeEventListener('change', this.handleMediaEvent)
);
}
handleMediaEvent = (event: MediaQueryListEvent) => {
console.log('handleMediaEvent', { event });
this.setState({
...resetScreen,
...this.calculateScreen(),
});
};
calculateScreen = () => {
if (this.mediaQueries.onDesktop.matches) {
return { onDesktop: true };
}
if (this.mediaQueries.onTablet.matches) {
return { onTablet: true };
}
return { onSmallScreen: true };
};
render() {
return (
<BreakpointContext.Provider value={{ screenSize: { ...this.state } }}>
{this.props.children}
</BreakpointContext.Provider>
);
}
}

View file

@ -0,0 +1,11 @@
import * as React from 'react';
import { BreakpointsProvider } from './BreakpointProvider';
import { BreakpointDebugTool } from './DebugTool';
export default {
title: 'Atoms/Breakpoints',
decorators: [(story) => <BreakpointsProvider>{story()}</BreakpointsProvider>],
component: BreakpointDebugTool,
};
export const DebugTool = () => <BreakpointDebugTool />;

View file

@ -0,0 +1,34 @@
export const breakpoints = {
onTablet: 768,
onDesktop: 1024,
};
export const mediaQueryDefs = {
onSmallScreen: `@media screen and (max-width: ${breakpoints.onTablet - 1}px)`,
onTablet: `@media screen and (min-width: ${breakpoints.onTablet}px)`,
onDesktop: `@media screen and (min-width: ${breakpoints.onDesktop}px)`,
};
export const onTablet = (...expressions: any) => {
return `
${mediaQueryDefs.onTablet} {
${expressions.join()}
}
`;
};
export const onDesktop = (...expressions: any) => {
return `
${mediaQueryDefs.onDesktop} {
${expressions.join()}
}
`;
};
export const onSmallScreen = (...expressions: any) => {
return `
${mediaQueryDefs.onSmallScreen} {
${expressions.join()}
}
`;
};

View file

@ -0,0 +1,27 @@
import { withContext } from '@roleypoly/misc-utils/withContext';
import * as React from 'react';
export type ScreenSize = {
onSmallScreen: boolean;
onTablet: boolean;
onDesktop: boolean;
};
export type BreakpointProps = {
screenSize: ScreenSize;
};
const defaultScreenSize: BreakpointProps = {
screenSize: {
onSmallScreen: true,
onDesktop: false,
onTablet: false,
},
};
export const BreakpointContext = React.createContext(defaultScreenSize);
export const useBreakpointContext = () => React.useContext(BreakpointContext);
export const withBreakpoints = <T>(Component: React.ComponentType<T>) =>
withContext(BreakpointContext, Component as any);

View file

@ -0,0 +1,56 @@
import * as React from 'react';
import styled from 'styled-components';
import { onDesktop, onTablet } from './Breakpoints';
import { useBreakpointContext } from './Context';
const DebuggerPosition = styled.div`
position: fixed;
top: 0;
left: 0;
font-family: monospace;
& > div {
display: flex;
}
`;
const OnSmallScreen = styled.div`
display: block;
`;
const OnTablet = styled.div`
display: none;
${onTablet(`display: block;`)}
`;
const OnDesktop = styled.div`
display: none;
${onDesktop`display: block;`}
`;
const CSSBreakpointDebugger = () => (
<div>
<OnSmallScreen style={{ backgroundColor: 'red' }}>S</OnSmallScreen>
<OnTablet style={{ backgroundColor: 'green' }}>T</OnTablet>
<OnDesktop style={{ backgroundColor: 'blue' }}>D</OnDesktop>
</div>
);
const JSBreakpointDebugger = () => {
const {
screenSize: { onTablet, onDesktop, onSmallScreen },
} = useBreakpointContext();
return (
<div>
{onSmallScreen && <div style={{ backgroundColor: 'red' }}>S</div>}
{onTablet && <div style={{ backgroundColor: 'green' }}>T</div>}
{onDesktop && <div style={{ backgroundColor: 'blue' }}>D</div>}
</div>
);
};
export const BreakpointDebugTool = () => (
<DebuggerPosition>
<JSBreakpointDebugger />
<CSSBreakpointDebugger />
</DebuggerPosition>
);

View file

@ -0,0 +1,3 @@
export * from './BreakpointProvider';
export * from './Breakpoints';
export * from './Context';