From cc4146202a57acfdf36ebffc75b7516030cae2ab Mon Sep 17 00:00:00 2001 From: Ben Grant Date: Fri, 18 Jun 2021 04:10:57 +1000 Subject: [PATCH 1/5] =?UTF-8?q?Update=20logo=20=F0=9F=A6=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crabfit-browser-extension/manifest.json | 2 +- crabfit-browser-extension/res/icon128.png | Bin 4459 -> 3357 bytes crabfit-browser-extension/res/icon16.png | Bin 620 -> 416 bytes crabfit-browser-extension/res/icon32.png | Bin 1192 -> 841 bytes crabfit-browser-extension/res/icon48.png | Bin 1827 -> 1328 bytes crabfit-frontend/public/favicon.ico | Bin 32793 -> 106563 bytes crabfit-frontend/public/logo-icon.png | Bin 13558 -> 10774 bytes crabfit-frontend/public/logo192.png | Bin 4610 -> 4713 bytes crabfit-frontend/public/logo512.png | Bin 13461 -> 13787 bytes .../UpdateDialog/updateDialogStyle.ts | 3 +- .../src/pages/Privacy/Privacy.tsx | 8 ++-- crabfit-frontend/src/res/logo.svg | 44 +----------------- 12 files changed, 8 insertions(+), 49 deletions(-) diff --git a/crabfit-browser-extension/manifest.json b/crabfit-browser-extension/manifest.json index ed47952..c56c83d 100644 --- a/crabfit-browser-extension/manifest.json +++ b/crabfit-browser-extension/manifest.json @@ -1,7 +1,7 @@ { "name": "Crab Fit", "description": "Enter your availability to find a time that works for everyone!", - "version": "1.1", + "version": "1.2", "manifest_version": 2, "author": "Ben Grant", diff --git a/crabfit-browser-extension/res/icon128.png b/crabfit-browser-extension/res/icon128.png index 6b9643dc544a24d9d1795a2b7a44fc1f446f6c86..4ee617e894883263b59c2505f27c264599d16d34 100644 GIT binary patch delta 3333 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 P00000NkvXXu0mjf3pZU# literal 4459 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 N002ovPDHLkV1lPK4nF_@ diff --git a/crabfit-browser-extension/res/icon32.png b/crabfit-browser-extension/res/icon32.png index 11987f188726e28ccf18b1a54c716f26ea1c6e5d..9995d95b9785cb889b20cf7ced11fc6744214580 100644 GIT binary patch delta 798 zcmV+(1L6Fr3CRYKIDZ2BNklCQ^E<@ z9|3t8rSc9XVIBActQUwgm<$0GZ**VyzbnNGL>pk@lHW^I`AvNU0;rY9uV9iE$;}#= z4SDpe$4=K~CBN$g64h91^Ez#d!b_mAkmJuqa)8PspfV#JU-+J(@}v~R2>6Ig&`zA# zGjnxF3xDXAR0VbfldqodRfrxIW#bDMh(`3_#+*nZT(ju|3D97flg$J~m9i{=Q{hO2 z^FSX)b=)=-N@v*>n0x_yU6jpPf%mxO9{`xEL#nvi4A=WamiKmYK%)<|S8!Xfk6WG| zu3X;ErUB8Wl%S4l=w_I|`-nD!q_1(+&=Srx!hanM4QUWPVAr=Y_aNG$u=jQZ_7d#3 zS#xsA5LKN`0J}g>xEesJbHKlhUIVMXhiNBVVb(=%?u6P`;c}`Q(UFk%fv3PT;Mn(M z)`Ub`MoM1BG4NP?_J!jpAJnZl#hvN;+FVyZC%YtJnXk}f~LER^VKPLYYcm8j9 c=NAF|1T<+8n#}VfrT_o{07*qoM6N<$f=m8-=>Px# delta 1151 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 F`+v)8l(ql> diff --git a/crabfit-frontend/public/logo-icon.png b/crabfit-frontend/public/logo-icon.png index 40961ea8b8ff59e871d537b1b151b758fd41c459..729153ee8b0d1d974346789356e90b5f6ca9cedc 100644 GIT binary patch literal 10774 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 literal 13558 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 CZ%G9J diff --git a/crabfit-frontend/public/logo192.png b/crabfit-frontend/public/logo192.png index 70f0a2cb593cea7c7963e8224a324c929ef9df23..f80366e8114ccce12c3f50d917524fa681a54da0 100644 GIT binary patch delta 4557 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 delta 4478 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 Q^Z)<=07*qoM6N<$f_L?1;Q#;t diff --git a/crabfit-frontend/public/logo512.png b/crabfit-frontend/public/logo512.png index 82acb670d80f35095e6391af248faae1674c5863..4ebd853d39d95d0c8f3aa183aa263ff8660cb33d 100644 GIT binary patch literal 13787 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 L>zYOCwjuu?@^RI) literal 13461 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 diff --git a/crabfit-frontend/src/components/UpdateDialog/updateDialogStyle.ts b/crabfit-frontend/src/components/UpdateDialog/updateDialogStyle.ts index 139f211..1e22753 100644 --- a/crabfit-frontend/src/components/UpdateDialog/updateDialogStyle.ts +++ b/crabfit-frontend/src/components/UpdateDialog/updateDialogStyle.ts @@ -13,7 +13,7 @@ export const Wrapper = styled.div` border-radius: 3px; width: 400px; box-sizing: border-box; - max-width: calc(100% - 20px); + max-width: calc(100% - 40px); box-shadow: 0 3px 6px 0 rgba(0,0,0,.3); & h2 { @@ -31,4 +31,5 @@ export const ButtonWrapper = styled.div` align-items: center; justify-content: flex-end; gap: 16px; + flex-wrap: wrap; `; diff --git a/crabfit-frontend/src/pages/Privacy/Privacy.tsx b/crabfit-frontend/src/pages/Privacy/Privacy.tsx index 3717c96..ffe7855 100644 --- a/crabfit-frontend/src/pages/Privacy/Privacy.tsx +++ b/crabfit-frontend/src/pages/Privacy/Privacy.tsx @@ -58,9 +58,9 @@ const Privacy = () => {

Information Collection and Use

The Service uses third party services that may collect information used to identify you.

Links to privacy policies of the third party service providers used by the Service:

- +

Log Data

When you use the Service, in the case of an error, data and information is collected to improve the Service, which may include your IP address, device name, operating system version, app configuration and the time and date of the error.

@@ -71,12 +71,12 @@ const Privacy = () => {

Service Providers

Third-party companies may be employed for the following reasons:

-
    +

  • To facilitate the Service
  • To provide the Service on our behalf
  • To perform Service-related services
  • To assist in analyzing how the Service is used
  • -
+

To perform these tasks, the third parties may have access to your Personal Information, but are obligated not to disclose or use this information for any purpose except the above.

Security

diff --git a/crabfit-frontend/src/res/logo.svg b/crabfit-frontend/src/res/logo.svg index 87c2c60..5d66013 100644 --- a/crabfit-frontend/src/res/logo.svg +++ b/crabfit-frontend/src/res/logo.svg @@ -1,43 +1 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file From e94559c4f628ebe5843d5b11b56bd62ddb3bd040 Mon Sep 17 00:00:00 2001 From: Ben Grant Date: Sat, 19 Jun 2021 10:32:09 +1000 Subject: [PATCH 2/5] Hide extension buttons in android app --- crabfit-frontend/src/pages/Home/Home.tsx | 60 ++++++++++--------- .../src/pages/Privacy/privacyStyle.ts | 2 + 2 files changed, 34 insertions(+), 28 deletions(-) diff --git a/crabfit-frontend/src/pages/Home/Home.tsx b/crabfit-frontend/src/pages/Home/Home.tsx index c434b9e..8a6bd55 100644 --- a/crabfit-frontend/src/pages/Home/Home.tsx +++ b/crabfit-frontend/src/pages/Home/Home.tsx @@ -39,6 +39,7 @@ import { import api from 'services'; import { detect_browser } from 'utils'; +import { useTWAStore } from 'stores'; import logo from 'res/logo.svg'; import timezones from 'res/timezones.json'; @@ -63,6 +64,7 @@ const Home = ({ offline }) => { const [browser, setBrowser] = useState(undefined); const { push } = useHistory(); const { t } = useTranslation(['common', 'home']); + const isTWA = useTWAStore(state => state.TWA); useEffect(() => { const fetch = async () => { @@ -231,38 +233,40 @@ const Home = ({ offline }) => {

Crab Fit helps you fit your event around everyone's schedules. Simply create an event above and send the link to everyone that is participating. Results update live and you will be able to see a heat-map of when everyone is free.
Learn more about how to Crab Fit.

- - {['chrome', 'firefox', 'safari'].includes(browser) && ( + {isTWA !== true && ( + + {['chrome', 'firefox', 'safari'].includes(browser) && ( + + )} - )} - - + >{t('home:about.android_app')} + + )}

Created by Ben Grant, Crab Fit is the modern-day solution to your group event planning debates.

The code for Crab Fit is open source, if you find any issues or want to contribute, you can visit the repository. By using Crab Fit you agree to the privacy policy.

{t('home:about.content.p6')}

diff --git a/crabfit-frontend/src/pages/Privacy/privacyStyle.ts b/crabfit-frontend/src/pages/Privacy/privacyStyle.ts index 7597810..74746a4 100644 --- a/crabfit-frontend/src/pages/Privacy/privacyStyle.ts +++ b/crabfit-frontend/src/pages/Privacy/privacyStyle.ts @@ -7,6 +7,8 @@ export const Note = styled.p` padding: 12px 16px; margin: 16px 0; box-sizing: border-box; + font-weight: 500; + line-height: 1.6em; & a { color: ${props => props.theme.mode === 'light' ? props.theme.primaryDark : props.theme.primaryLight}; From fdb7f0ef67725a28d5c773aa329d098a2062d9e2 Mon Sep 17 00:00:00 2001 From: Ben Grant Date: Sat, 19 Jun 2021 12:04:52 +1000 Subject: [PATCH 3/5] Tabs -> spaces I have become my own worst enemy --- crabfit-frontend/public/index.css | 6 +- crabfit-frontend/public/index.html | 16 +- crabfit-frontend/src/App.tsx | 98 +- .../AvailabilityEditor/AvailabilityEditor.tsx | 206 +-- .../availabilityEditorStyle.ts | 32 +- .../AvailabilityViewer/AvailabilityViewer.tsx | 80 +- .../availabilityViewerStyle.ts | 162 +-- .../src/components/Button/Button.tsx | 2 +- .../src/components/Button/buttonStyle.ts | 46 +- .../CalendarField/CalendarField.tsx | 286 ++-- .../CalendarField/calendarFieldStyle.ts | 130 +- .../src/components/Center/Center.ts | 6 +- .../src/components/Donate/Donate.tsx | 10 +- .../src/components/Donate/donateStyle.ts | 2 +- crabfit-frontend/src/components/Egg/Egg.tsx | 6 +- .../src/components/Egg/eggStyle.ts | 6 +- .../src/components/Error/Error.tsx | 18 +- .../src/components/Error/errorStyle.ts | 36 +- .../src/components/Footer/footerStyle.ts | 12 +- .../GoogleCalendar/GoogleCalendar.tsx | 6 +- .../src/components/Legend/Legend.tsx | 40 +- .../src/components/Legend/legendStyle.ts | 62 +- .../src/components/Logo/logoStyle.ts | 24 +- .../OutlookCalendar/OutlookCalendar.tsx | 6 +- .../src/components/Recents/recentsStyle.ts | 2 +- .../components/SelectField/SelectField.tsx | 54 +- .../SelectField/selectFieldStyle.ts | 72 +- .../src/components/Settings/settingsStyle.ts | 24 +- .../src/components/TextField/TextField.tsx | 28 +- .../components/TextField/textFieldStyle.ts | 60 +- .../TimeRangeField/TimeRangeField.tsx | 180 +-- .../TimeRangeField/timeRangeFieldStyle.ts | 106 +- .../components/ToggleField/ToggleField.tsx | 22 +- .../ToggleField/toggleFieldStyle.ts | 12 +- .../components/UpdateDialog/UpdateDialog.tsx | 6 +- crabfit-frontend/src/pages/Create/Create.tsx | 216 +-- .../src/pages/Create/createStyle.ts | 50 +- crabfit-frontend/src/pages/Event/Event.tsx | 662 ++++----- .../src/pages/Event/eventStyle.ts | 154 +-- crabfit-frontend/src/pages/Help/Help.tsx | 42 +- crabfit-frontend/src/pages/Help/helpStyle.ts | 114 +- crabfit-frontend/src/pages/Home/Home.tsx | 304 ++--- crabfit-frontend/src/pages/Home/homeStyle.ts | 90 +- .../src/pages/Privacy/Privacy.tsx | 42 +- .../src/pages/Privacy/privacyStyle.ts | 2 +- crabfit-frontend/src/res/google.svg | 10 +- crabfit-frontend/src/res/timezones.json | 1188 ++++++++--------- crabfit-frontend/src/services/index.js | 66 +- crabfit-frontend/src/theme/index.ts | 44 +- 49 files changed, 2424 insertions(+), 2424 deletions(-) diff --git a/crabfit-frontend/public/index.css b/crabfit-frontend/public/index.css index 399b4a0..80d01b8 100644 --- a/crabfit-frontend/public/index.css +++ b/crabfit-frontend/public/index.css @@ -1,7 +1,7 @@ @font-face { - font-family: Karla; - src: url('fonts/karla-variable.ttf') format('truetype'); - font-weight: 1 999; + font-family: Karla; + src: url('fonts/karla-variable.ttf') format('truetype'); + font-weight: 1 999; } @font-face { diff --git a/crabfit-frontend/public/index.html b/crabfit-frontend/public/index.html index 4ccb9ac..2352c9d 100644 --- a/crabfit-frontend/public/index.html +++ b/crabfit-frontend/public/index.html @@ -5,10 +5,10 @@ - + - - - + + + - + Crab Fit diff --git a/crabfit-frontend/src/App.tsx b/crabfit-frontend/src/App.tsx index 7a4b0aa..23b8b5b 100644 --- a/crabfit-frontend/src/App.tsx +++ b/crabfit-frontend/src/App.tsx @@ -20,8 +20,8 @@ const wb = new Workbox('sw.js'); const App = () => { const colortheme = useSettingsStore(state => state.theme); - const darkQuery = window.matchMedia('(prefers-color-scheme: dark)'); - const [isDark, setIsDark] = useState(darkQuery.matches); + const darkQuery = window.matchMedia('(prefers-color-scheme: dark)'); + const [isDark, setIsDark] = useState(darkQuery.matches); const [offline, setOffline] = useState(!window.navigator.onLine); const [eggCount, setEggCount] = useState(0); @@ -46,7 +46,7 @@ const App = () => { [eggCount, eggKey] ); - darkQuery.addListener(e => colortheme === 'System' && setIsDark(e.matches)); + darkQuery.addListener(e => colortheme === 'System' && setIsDark(e.matches)); useEffect(() => { const onOffline = () => setOffline(true); @@ -87,56 +87,56 @@ const App = () => { }, [colortheme, darkQuery.matches]); return ( - - - ({ - html: { - scrollBehavior: 'smooth', - }, - body: { - backgroundColor: theme.background, - color: theme.text, - fontFamily: `'Karla', sans-serif`, - fontWeight: theme.mode === 'dark' ? 500 : 600, - margin: 0, - }, - a: { - color: theme.primary, - }, - '*::-webkit-scrollbar': { - width: 16, - height: 16, - }, - '*::-webkit-scrollbar-track': { - background: `${theme.primaryBackground}`, - }, - '*::-webkit-scrollbar-thumb': { - borderRadius: 100, - border: `4px solid ${theme.primaryBackground}`, - width: 12, - background: `${theme.mode === 'light' ? theme.primaryLight : theme.primaryDark}AA`, - }, - '*::-webkit-scrollbar-thumb:hover': { - background: `${theme.mode === 'light' ? theme.primaryLight : theme.primaryDark}CC`, - }, - '*::-webkit-scrollbar-thumb:active': { - background: `${theme.mode === 'light' ? theme.primaryLight : theme.primaryDark}`, - }, - })} - /> + + + ({ + html: { + scrollBehavior: 'smooth', + }, + body: { + backgroundColor: theme.background, + color: theme.text, + fontFamily: `'Karla', sans-serif`, + fontWeight: theme.mode === 'dark' ? 500 : 600, + margin: 0, + }, + a: { + color: theme.primary, + }, + '*::-webkit-scrollbar': { + width: 16, + height: 16, + }, + '*::-webkit-scrollbar-track': { + background: `${theme.primaryBackground}`, + }, + '*::-webkit-scrollbar-thumb': { + borderRadius: 100, + border: `4px solid ${theme.primaryBackground}`, + width: 12, + background: `${theme.mode === 'light' ? theme.primaryLight : theme.primaryDark}AA`, + }, + '*::-webkit-scrollbar-thumb:hover': { + background: `${theme.mode === 'light' ? theme.primaryLight : theme.primaryDark}CC`, + }, + '*::-webkit-scrollbar-thumb:active': { + background: `${theme.mode === 'light' ? theme.primaryLight : theme.primaryDark}`, + }, + })} + /> }> - - ( + + ( }> )} /> - ( + ( }> @@ -146,17 +146,17 @@ const App = () => { )} /> - ( + ( }> )} /> - ( + ( }> )} /> - + {updateAvailable && ( }> @@ -165,8 +165,8 @@ const App = () => { )} {eggVisible && setEggVisible(false)} />} - - + + ); } diff --git a/crabfit-frontend/src/components/AvailabilityEditor/AvailabilityEditor.tsx b/crabfit-frontend/src/components/AvailabilityEditor/AvailabilityEditor.tsx index b1a93d7..165ed5b 100644 --- a/crabfit-frontend/src/components/AvailabilityEditor/AvailabilityEditor.tsx +++ b/crabfit-frontend/src/components/AvailabilityEditor/AvailabilityEditor.tsx @@ -9,17 +9,17 @@ import dayjs_timezone from 'dayjs/plugin/timezone'; import utc from 'dayjs/plugin/utc'; import { - Wrapper, + Wrapper, ScrollWrapper, - Container, - Date, - Times, - DateLabel, - DayLabel, - Spacer, - TimeLabels, - TimeLabel, - TimeSpace, + Container, + Date, + Times, + DateLabel, + DayLabel, + Spacer, + TimeLabels, + TimeLabel, + TimeSpace, StyledMain, } from 'components/AvailabilityViewer/availabilityViewerStyle'; import { Time } from './availabilityEditorStyle'; @@ -37,34 +37,34 @@ dayjs.extend(utc); dayjs.extend(dayjs_timezone); const AvailabilityEditor = ({ - times, - timeLabels, - dates, + times, + timeLabels, + dates, timezone, isSpecificDates, - value = [], - onChange, - ...props + value = [], + onChange, + ...props }) => { const { t } = useTranslation('event'); const locale = useLocaleUpdateStore(state => state.locale); - const [selectingTimes, _setSelectingTimes] = useState([]); - const staticSelectingTimes = useRef([]); - const setSelectingTimes = newTimes => { - staticSelectingTimes.current = newTimes; - _setSelectingTimes(newTimes); - }; + const [selectingTimes, _setSelectingTimes] = useState([]); + const staticSelectingTimes = useRef([]); + const setSelectingTimes = newTimes => { + staticSelectingTimes.current = newTimes; + _setSelectingTimes(newTimes); + }; - const startPos = useRef({}); - const staticMode = useRef(null); - const [mode, _setMode] = useState(staticMode.current); - const setMode = newMode => { - staticMode.current = newMode; - _setMode(newMode); - }; + const startPos = useRef({}); + const staticMode = useRef(null); + const [mode, _setMode] = useState(staticMode.current); + const setMode = newMode => { + staticMode.current = newMode; + _setMode(newMode); + }; - return ( + return ( <>
{t('event:you.info')}
@@ -98,89 +98,89 @@ const AvailabilityEditor = ({
)} - + - - - {!!timeLabels.length && timeLabels.map((label, i) => - - {label.label?.length !== '' && {label.label}} - - )} - - {dates.map((date, x) => { - const parsedDate = isSpecificDates ? dayjs(date, 'DDMMYYYY') : dayjs().day(date); - const last = dates.length === x+1 || (isSpecificDates ? dayjs(dates[x+1], 'DDMMYYYY') : dayjs().day(dates[x+1])).diff(parsedDate, 'day') > 1; - return ( - - - {isSpecificDates && {parsedDate.format('MMM D')}} - {parsedDate.format('ddd')} + + + {!!timeLabels.length && timeLabels.map((label, i) => + + {label.label?.length !== '' && {label.label}} + + )} + + {dates.map((date, x) => { + const parsedDate = isSpecificDates ? dayjs(date, 'DDMMYYYY') : dayjs().day(date); + const last = dates.length === x+1 || (isSpecificDates ? dayjs(dates[x+1], 'DDMMYYYY') : dayjs().day(dates[x+1])).diff(parsedDate, 'day') > 1; + return ( + + + {isSpecificDates && {parsedDate.format('MMM D')}} + {parsedDate.format('ddd')} 1} > - {timeLabels.map((timeLabel, y) => { - if (!timeLabel.time) return null; - if (!times.includes(`${timeLabel.time}-${date}`)) { - return ( - - ); - } - const time = `${timeLabel.time}-${date}`; + {timeLabels.map((timeLabel, y) => { + if (!timeLabel.time) return null; + if (!times.includes(`${timeLabel.time}-${date}`)) { + return ( + + ); + } + const time = `${timeLabel.time}-${date}`; - return ( - - - {last && dates.length !== x+1 && ( - - )} - - ); - })} - + document.addEventListener('pointerup', () => { + if (staticMode.current === 'add') { + onChange([...value, ...staticSelectingTimes.current]); + } else if (staticMode.current === 'remove') { + onChange(value.filter(t => !staticSelectingTimes.current.includes(t))); + } + setMode(null); + }, { once: true }); + }} + onPointerEnter={() => { + if (staticMode.current) { + let found = []; + for (let cy = Math.min(startPos.current.y, y); cy < Math.max(startPos.current.y, y)+1; cy++) { + for (let cx = Math.min(startPos.current.x, x); cx < Math.max(startPos.current.x, x)+1; cx++) { + found.push({y: cy, x: cx}); + } + } + setSelectingTimes(found.filter(d => timeLabels[d.y].time?.length === 4).map(d => `${timeLabels[d.y].time}-${dates[d.x]}`)); + } + }} + /> + ); + })} + + + {last && dates.length !== x+1 && ( + + )} + + ); + })} + - + - ); + ); }; export default AvailabilityEditor; diff --git a/crabfit-frontend/src/components/AvailabilityEditor/availabilityEditorStyle.ts b/crabfit-frontend/src/components/AvailabilityEditor/availabilityEditorStyle.ts index 417ae33..65cb48e 100644 --- a/crabfit-frontend/src/components/AvailabilityEditor/availabilityEditorStyle.ts +++ b/crabfit-frontend/src/components/AvailabilityEditor/availabilityEditorStyle.ts @@ -1,24 +1,24 @@ import styled from '@emotion/styled'; export const Time = styled.div` - height: 10px; - touch-action: none; + height: 10px; + touch-action: none; transition: background-color .1s; ${props => props.time.slice(2, 4) === '00' && ` - border-top: 2px solid ${props.theme.text}; - `} - ${props => props.time.slice(2, 4) !== '00' && ` - border-top: 2px solid transparent; - `} - ${props => props.time.slice(2, 4) === '30' && ` - border-top: 2px dotted ${props.theme.text}; - `} + border-top: 2px solid ${props.theme.text}; + `} + ${props => props.time.slice(2, 4) !== '00' && ` + border-top: 2px solid transparent; + `} + ${props => props.time.slice(2, 4) === '30' && ` + border-top: 2px dotted ${props.theme.text}; + `} - ${props => (props.selected || (props.mode === 'add' && props.selecting)) && ` - background-color: ${props.theme.primary}; - `}; - ${props => props.mode === 'remove' && props.selecting && ` - background-color: ${props.theme.background}; - `}; + ${props => (props.selected || (props.mode === 'add' && props.selecting)) && ` + background-color: ${props.theme.primary}; + `}; + ${props => props.mode === 'remove' && props.selecting && ` + background-color: ${props.theme.background}; + `}; `; diff --git a/crabfit-frontend/src/components/AvailabilityViewer/AvailabilityViewer.tsx b/crabfit-frontend/src/components/AvailabilityViewer/AvailabilityViewer.tsx index 02564f3..92ec00c 100644 --- a/crabfit-frontend/src/components/AvailabilityViewer/AvailabilityViewer.tsx +++ b/crabfit-frontend/src/components/AvailabilityViewer/AvailabilityViewer.tsx @@ -9,23 +9,23 @@ import { useSettingsStore, useLocaleUpdateStore } from 'stores'; import { Legend, Center } from 'components'; import { - Wrapper, - ScrollWrapper, - Container, - Date, - Times, - DateLabel, - DayLabel, - Time, - Spacer, - Tooltip, - TooltipTitle, - TooltipDate, - TooltipContent, + Wrapper, + ScrollWrapper, + Container, + Date, + Times, + DateLabel, + DayLabel, + Time, + Spacer, + Tooltip, + TooltipTitle, + TooltipDate, + TooltipContent, TooltipPerson, - TimeLabels, - TimeLabel, - TimeSpace, + TimeLabels, + TimeLabel, + TimeSpace, People, Person, StyledMain, @@ -38,16 +38,16 @@ dayjs.extend(customParseFormat); dayjs.extend(relativeTime); const AvailabilityViewer = ({ - times, - timeLabels, - dates, + times, + timeLabels, + dates, isSpecificDates, - people = [], - min = 0, - max = 0, - ...props + people = [], + min = 0, + max = 0, + ...props }) => { - const [tooltip, setTooltip] = useState(null); + const [tooltip, setTooltip] = useState(null); const timeFormat = useSettingsStore(state => state.timeFormat); const highlight = useSettingsStore(state => state.highlight); const [filteredPeople, setFilteredPeople] = useState([]); @@ -153,7 +153,7 @@ const AvailabilityViewer = ({ times, ]); - return ( + return ( <> - - - {heatmap} + + + {heatmap} - {tooltip && ( - - {tooltip.available} - {tooltip.date} + {tooltip && ( + + {tooltip.available} + {tooltip.date} {!!filteredPeople.length && ( - + {tooltip.people.map(person => {person} )} @@ -215,12 +215,12 @@ const AvailabilityViewer = ({ )} )} - - )} + + )} - + - ); + ); }; export default AvailabilityViewer; diff --git a/crabfit-frontend/src/components/AvailabilityViewer/availabilityViewerStyle.ts b/crabfit-frontend/src/components/AvailabilityViewer/availabilityViewerStyle.ts index 330b3cc..76cc3cf 100644 --- a/crabfit-frontend/src/components/AvailabilityViewer/availabilityViewerStyle.ts +++ b/crabfit-frontend/src/components/AvailabilityViewer/availabilityViewerStyle.ts @@ -1,8 +1,8 @@ import styled from '@emotion/styled'; export const Wrapper = styled.div` - overflow-y: visible; - margin: 20px 0; + overflow-y: visible; + margin: 20px 0; position: relative; `; @@ -11,30 +11,30 @@ export const ScrollWrapper = styled.div` `; export const Container = styled.div` - display: inline-flex; - box-sizing: border-box; + display: inline-flex; + box-sizing: border-box; min-width: 100%; - align-items: flex-end; - justify-content: center; - padding: 0 calc(calc(100% - 600px) / 2); + align-items: flex-end; + justify-content: center; + padding: 0 calc(calc(100% - 600px) / 2); - @media (max-width: 660px) { - padding: 0 30px; - } + @media (max-width: 660px) { + padding: 0 30px; + } `; export const Date = styled.div` - flex-shrink: 0; - display: flex; - flex-direction: column; - width: 60px; - min-width: 60px; - margin-bottom: 10px; + flex-shrink: 0; + display: flex; + flex-direction: column; + width: 60px; + min-width: 60px; + margin-bottom: 10px; `; export const Times = styled.div` - display: flex; - flex-direction: column; + display: flex; + flex-direction: column; border-bottom: 2px solid ${props => props.theme.text}; border-left: 1px solid ${props => props.theme.text}; @@ -57,44 +57,44 @@ export const Times = styled.div` `; export const DateLabel = styled.label` - display: block; - font-size: 12px; - text-align: center; - user-select: none; + display: block; + font-size: 12px; + text-align: center; + user-select: none; `; export const DayLabel = styled.label` - display: block; - font-size: 15px; - text-align: center; - user-select: none; + display: block; + font-size: 15px; + text-align: center; + user-select: none; `; export const Time = styled.div` - height: 10px; + height: 10px; background-origin: border-box; transition: background-color .1s; - ${props => props.time.slice(2, 4) === '00' && ` - border-top: 2px solid ${props.theme.text}; - `} - ${props => props.time.slice(2, 4) !== '00' && ` - border-top: 2px solid transparent; - `} - ${props => props.time.slice(2, 4) === '30' && ` - border-top: 2px dotted ${props.theme.text}; - `} + ${props => props.time.slice(2, 4) === '00' && ` + border-top: 2px solid ${props.theme.text}; + `} + ${props => props.time.slice(2, 4) !== '00' && ` + border-top: 2px solid transparent; + `} + ${props => props.time.slice(2, 4) === '30' && ` + border-top: 2px dotted ${props.theme.text}; + `} background-color: ${props => `${props.theme.primary}${Math.round((props.peopleCount/props.maxPeople)*255).toString(16)}`}; ${props => props.highlight && props.peopleCount === props.maxPeople && props.peopleCount > 0 && ` background-image: repeating-linear-gradient( 45deg, - transparent, - transparent 4.3px, - ${props.theme.primaryDark} 4.3px, - ${props.theme.primaryDark} 8.6px - ); + transparent, + transparent 4.3px, + ${props.theme.primaryDark} 4.3px, + ${props.theme.primaryDark} 8.6px + ); `} @media (prefers-reduced-motion: reduce) { @@ -103,40 +103,40 @@ export const Time = styled.div` `; export const Spacer = styled.div` - width: 12px; - flex-shrink: 0; + width: 12px; + flex-shrink: 0; `; export const Tooltip = styled.div` - position: absolute; - top: ${props => props.y}px; - left: ${props => props.x}px; - transform: translateX(-50%); - border: 1px solid ${props => props.theme.text}; - border-radius: 3px; - padding: 4px 8px; - background-color: ${props => props.theme.background}${props => props.theme.mode === 'light' ? 'EE' : 'DD'}; - max-width: 200px; - pointer-events: none; + position: absolute; + top: ${props => props.y}px; + left: ${props => props.x}px; + transform: translateX(-50%); + border: 1px solid ${props => props.theme.text}; + border-radius: 3px; + padding: 4px 8px; + background-color: ${props => props.theme.background}${props => props.theme.mode === 'light' ? 'EE' : 'DD'}; + max-width: 200px; + pointer-events: none; z-index: 100; user-select: none; `; export const TooltipTitle = styled.span` - font-size: 15px; - display: block; - font-weight: 700; + font-size: 15px; + display: block; + font-weight: 700; `; export const TooltipDate = styled.span` - font-size: 13px; - display: block; - opacity: .8; - font-weight: 600; + font-size: 13px; + display: block; + opacity: .8; + font-weight: 600; `; export const TooltipContent = styled.div` - font-size: 13px; + font-size: 13px; padding: 4px 0; `; @@ -154,38 +154,38 @@ export const TooltipPerson = styled.span` `; export const TimeLabels = styled.div` - flex-shrink: 0; - display: flex; - flex-direction: column; - width: 40px; - padding-right: 6px; + flex-shrink: 0; + display: flex; + flex-direction: column; + width: 40px; + padding-right: 6px; `; export const TimeSpace = styled.div` - height: 10px; - position: relative; - border-top: 2px solid transparent; + height: 10px; + position: relative; + border-top: 2px solid transparent; &.timespace { background-origin: border-box; background-image: repeating-linear-gradient( 45deg, - transparent, - transparent 4.3px, - ${props => props.theme.loading} 4.3px, - ${props => props.theme.loading} 8.6px - ); + transparent, + transparent 4.3px, + ${props => props.theme.loading} 4.3px, + ${props => props.theme.loading} 8.6px + ); } `; export const TimeLabel = styled.label` - display: block; - position: absolute; - top: -.7em; - font-size: 12px; - text-align: right; - user-select: none; - width: 100%; + display: block; + position: absolute; + top: -.7em; + font-size: 12px; + text-align: right; + user-select: none; + width: 100%; `; export const StyledMain = styled.div` diff --git a/crabfit-frontend/src/components/Button/Button.tsx b/crabfit-frontend/src/components/Button/Button.tsx index 64e788d..e7a067b 100644 --- a/crabfit-frontend/src/components/Button/Button.tsx +++ b/crabfit-frontend/src/components/Button/Button.tsx @@ -1,7 +1,7 @@ import { Pressable } from './buttonStyle'; const Button = ({ href, type = 'button', icon, children, ...props }) => ( - props.isLoading && ` - color: transparent; - cursor: wait; + color: transparent; + cursor: wait; & img { opacity: 0; } - @keyframes load { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } - } + @keyframes load { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } + } - &:after { - content: ''; - position: absolute; - top: calc(50% - 12px); - left: calc(50% - 12px); - height: 18px; - width: 18px; - border: 3px solid ${props.primaryColor ? '#FFF' : props.theme.background}; - border-left-color: transparent; - border-radius: 100px; - animation: load .5s linear infinite; - } + &:after { + content: ''; + position: absolute; + top: calc(50% - 12px); + left: calc(50% - 12px); + height: 18px; + width: 18px; + border: 3px solid ${props.primaryColor ? '#FFF' : props.theme.background}; + border-left-color: transparent; + border-radius: 100px; + animation: load .5s linear infinite; + } @media (prefers-reduced-motion: reduce) { &:after { @@ -106,7 +106,7 @@ export const Pressable = styled.button` justify-content: center; } } - `} + `} ${props => props.secondary && ` background: transparent; diff --git a/crabfit-frontend/src/components/CalendarField/CalendarField.tsx b/crabfit-frontend/src/components/CalendarField/CalendarField.tsx index 1927aa6..e90012c 100644 --- a/crabfit-frontend/src/components/CalendarField/CalendarField.tsx +++ b/crabfit-frontend/src/components/CalendarField/CalendarField.tsx @@ -9,14 +9,14 @@ import { Button, ToggleField } from 'components'; import { useSettingsStore, useLocaleUpdateStore } from 'stores'; import { - Wrapper, - StyledLabel, - StyledSubLabel, - CalendarHeader, - CalendarDays, - CalendarBody, - Date, - Day, + Wrapper, + StyledLabel, + StyledSubLabel, + CalendarHeader, + CalendarDays, + CalendarBody, + Date, + Day, } from './calendarFieldStyle'; dayjs.extend(isToday); @@ -24,90 +24,90 @@ dayjs.extend(localeData); dayjs.extend(updateLocale); const calculateMonth = (month, year, weekStart) => { - const date = dayjs().month(month).year(year); - const daysInMonth = date.daysInMonth(); - const daysBefore = date.date(1).day() - weekStart; - const daysAfter = 6 - date.date(daysInMonth).day() + weekStart; + const date = dayjs().month(month).year(year); + const daysInMonth = date.daysInMonth(); + const daysBefore = date.date(1).day() - weekStart; + const daysAfter = 6 - date.date(daysInMonth).day() + weekStart; - let dates = []; - let curDate = date.date(1).subtract(daysBefore, 'day'); - let y = 0; - let x = 0; - for (let i = 0; i < daysBefore + daysInMonth + daysAfter; i++) { - if (x === 0) dates[y] = []; - dates[y][x] = curDate.clone(); - curDate = curDate.add(1, 'day'); - x++; - if (x > 6) { - x = 0; - y++; - } - } + let dates = []; + let curDate = date.date(1).subtract(daysBefore, 'day'); + let y = 0; + let x = 0; + for (let i = 0; i < daysBefore + daysInMonth + daysAfter; i++) { + if (x === 0) dates[y] = []; + dates[y][x] = curDate.clone(); + curDate = curDate.add(1, 'day'); + x++; + if (x > 6) { + x = 0; + y++; + } + } - return dates; + return dates; }; const CalendarField = forwardRef(({ - label, - subLabel, - id, + label, + subLabel, + id, setValue, - ...props + ...props }, ref) => { const weekStart = useSettingsStore(state => state.weekStart); const locale = useLocaleUpdateStore(state => state.locale); const { t } = useTranslation('home'); - const [type, setType] = useState(0); + const [type, setType] = useState(0); const [dates, setDates] = useState(calculateMonth(dayjs().month(), dayjs().year(), weekStart)); - const [month, setMonth] = useState(dayjs().month()); - const [year, setYear] = useState(dayjs().year()); + const [month, setMonth] = useState(dayjs().month()); + const [year, setYear] = useState(dayjs().year()); - const [selectedDates, setSelectedDates] = useState([]); - const [selectingDates, _setSelectingDates] = useState([]); - const staticSelectingDates = useRef([]); - const setSelectingDates = newDates => { - staticSelectingDates.current = newDates; - _setSelectingDates(newDates); - }; + const [selectedDates, setSelectedDates] = useState([]); + const [selectingDates, _setSelectingDates] = useState([]); + const staticSelectingDates = useRef([]); + const setSelectingDates = newDates => { + staticSelectingDates.current = newDates; + _setSelectingDates(newDates); + }; - const [selectedDays, setSelectedDays] = useState([]); - const [selectingDays, _setSelectingDays] = useState([]); - const staticSelectingDays = useRef([]); - const setSelectingDays = newDays => { - staticSelectingDays.current = newDays; - _setSelectingDays(newDays); - }; + const [selectedDays, setSelectedDays] = useState([]); + const [selectingDays, _setSelectingDays] = useState([]); + const staticSelectingDays = useRef([]); + const setSelectingDays = newDays => { + staticSelectingDays.current = newDays; + _setSelectingDays(newDays); + }; - const startPos = useRef({}); - const staticMode = useRef(null); - const [mode, _setMode] = useState(staticMode.current); - const setMode = newMode => { - staticMode.current = newMode; - _setMode(newMode); - }; + const startPos = useRef({}); + const staticMode = useRef(null); + const [mode, _setMode] = useState(staticMode.current); + const setMode = newMode => { + staticMode.current = newMode; + _setMode(newMode); + }; useEffect(() => setValue(props.name, type ? JSON.stringify(selectedDays) : JSON.stringify(selectedDates)), [type, selectedDays, selectedDates, setValue, props.name]); - useEffect(() => { + useEffect(() => { if (dayjs.Ls.hasOwnProperty(locale) && weekStart !== dayjs.Ls[locale].weekStart) { dayjs.updateLocale(locale, { weekStart }); } - setDates(calculateMonth(month, year, weekStart)); - }, [weekStart, month, year, locale]); + setDates(calculateMonth(month, year, weekStart)); + }, [weekStart, month, year, locale]); - return ( - - {label && {label}} - {subLabel && {subLabel}} - + {label && {label}} + {subLabel && {subLabel}} + + value={type ? JSON.stringify(selectedDays) : JSON.stringify(selectedDates)} + {...props} + /> - - - {dayjs.months()[month]} {year} - - + + + {dayjs.months()[month]} {year} + + - - {(weekStart ? [...dayjs.weekdaysShort().filter((_,i) => i !== 0), dayjs.weekdaysShort()[0]] : dayjs.weekdaysShort()).map(name => - {name} - )} - - - {dates.length > 0 && dates.map((dateRow, y) => - dateRow.map((date, x) => - + {(weekStart ? [...dayjs.weekdaysShort().filter((_,i) => i !== 0), dayjs.weekdaysShort()[0]] : dayjs.weekdaysShort()).map(name => + {name} + )} + + + {dates.length > 0 && dates.map((dateRow, y) => + dateRow.map((date, x) => + { if (e.key === ' ' || e.key === 'Enter') { @@ -176,37 +176,37 @@ const CalendarField = forwardRef(({ } } }} - onPointerDown={e => { - startPos.current = {x, y}; - setMode(selectedDates.includes(date.format('DDMMYYYY')) ? 'remove' : 'add'); - setSelectingDates([date]); - e.currentTarget.releasePointerCapture(e.pointerId); + onPointerDown={e => { + startPos.current = {x, y}; + setMode(selectedDates.includes(date.format('DDMMYYYY')) ? 'remove' : 'add'); + setSelectingDates([date]); + e.currentTarget.releasePointerCapture(e.pointerId); - document.addEventListener('pointerup', () => { - if (staticMode.current === 'add') { - setSelectedDates([...selectedDates, ...staticSelectingDates.current.map(d => d.format('DDMMYYYY'))]); - } else if (staticMode.current === 'remove') { - const toRemove = staticSelectingDates.current.map(d => d.format('DDMMYYYY')); - setSelectedDates(selectedDates.filter(d => !toRemove.includes(d))); - } - setMode(null); - }, { once: true }); - }} - onPointerEnter={() => { - if (staticMode.current) { - let found = []; - for (let cy = Math.min(startPos.current.y, y); cy < Math.max(startPos.current.y, y)+1; cy++) { - for (let cx = Math.min(startPos.current.x, x); cx < Math.max(startPos.current.x, x)+1; cx++) { - found.push({y: cy, x: cx}); - } - } - setSelectingDates(found.map(d => dates[d.y][d.x])); - } - }} - >{date.date()} - ) - )} - + document.addEventListener('pointerup', () => { + if (staticMode.current === 'add') { + setSelectedDates([...selectedDates, ...staticSelectingDates.current.map(d => d.format('DDMMYYYY'))]); + } else if (staticMode.current === 'remove') { + const toRemove = staticSelectingDates.current.map(d => d.format('DDMMYYYY')); + setSelectedDates(selectedDates.filter(d => !toRemove.includes(d))); + } + setMode(null); + }, { once: true }); + }} + onPointerEnter={() => { + if (staticMode.current) { + let found = []; + for (let cy = Math.min(startPos.current.y, y); cy < Math.max(startPos.current.y, y)+1; cy++) { + for (let cx = Math.min(startPos.current.x, x); cx < Math.max(startPos.current.x, x)+1; cx++) { + found.push({y: cy, x: cx}); + } + } + setSelectingDates(found.map(d => dates[d.y][d.x])); + } + }} + >{date.date()} + ) + )} + ) : ( @@ -257,8 +257,8 @@ const CalendarField = forwardRef(({ )} )} - - ); + + ); }); export default CalendarField; diff --git a/crabfit-frontend/src/components/CalendarField/calendarFieldStyle.ts b/crabfit-frontend/src/components/CalendarField/calendarFieldStyle.ts index 7dcee99..fe6c4b8 100644 --- a/crabfit-frontend/src/components/CalendarField/calendarFieldStyle.ts +++ b/crabfit-frontend/src/components/CalendarField/calendarFieldStyle.ts @@ -1,68 +1,68 @@ import styled from '@emotion/styled'; export const Wrapper = styled.div` - margin: 30px 0; + margin: 30px 0; `; export const StyledLabel = styled.label` - display: block; - padding-bottom: 4px; - font-size: 18px; + display: block; + padding-bottom: 4px; + font-size: 18px; `; export const StyledSubLabel = styled.label` - display: block; - font-size: 13px; - opacity: .6; + display: block; + font-size: 13px; + opacity: .6; `; export const CalendarHeader = styled.div` - display: flex; - align-items: center; - justify-content: space-between; - user-select: none; - padding: 6px 0; - font-size: 1.2em; - font-weight: bold; + display: flex; + align-items: center; + justify-content: space-between; + user-select: none; + padding: 6px 0; + font-size: 1.2em; + font-weight: bold; `; export const CalendarDays = styled.div` - display: grid; - grid-template-columns: repeat(7, 1fr); - grid-gap: 2px; + display: grid; + grid-template-columns: repeat(7, 1fr); + grid-gap: 2px; `; export const Day = styled.div` - display: flex; - align-items: center; - justify-content: center; - padding: 3px 0; - font-weight: bold; - user-select: none; - opacity: .7; + display: flex; + align-items: center; + justify-content: center; + padding: 3px 0; + font-weight: bold; + user-select: none; + opacity: .7; - @media (max-width: 350px) { - font-size: 12px; - } + @media (max-width: 350px) { + font-size: 12px; + } `; export const CalendarBody = styled.div` - display: grid; - grid-template-columns: repeat(7, 1fr); - grid-gap: 2px; + display: grid; + grid-template-columns: repeat(7, 1fr); + grid-gap: 2px; - & button:first-of-type { - border-top-left-radius: 3px; - } - & button:nth-of-type(7) { - border-top-right-radius: 3px; - } - & button:nth-last-of-type(7) { - border-bottom-left-radius: 3px; - } - & button:last-of-type { - border-bottom-right-radius: 3px; - } + & button:first-of-type { + border-top-left-radius: 3px; + } + & button:nth-of-type(7) { + border-top-right-radius: 3px; + } + & button:nth-last-of-type(7) { + border-bottom-left-radius: 3px; + } + & button:last-of-type { + border-bottom-right-radius: 3px; + } `; export const Date = styled.button` @@ -77,28 +77,28 @@ export const Date = styled.button` transition: none; } - background-color: ${props => props.theme.primaryBackground}; - border: 1px solid ${props => props.theme.primary}; - display: flex; - align-items: center; - justify-content: center; - padding: 10px 0; - user-select: none; - touch-action: none; + background-color: ${props => props.theme.primaryBackground}; + border: 1px solid ${props => props.theme.primary}; + display: flex; + align-items: center; + justify-content: center; + padding: 10px 0; + user-select: none; + touch-action: none; - ${props => props.otherMonth && ` - color: ${props.theme.mode === 'light' ? props.theme.primaryLight : props.theme.primaryDark}; - `} - ${props => props.isToday && ` - font-weight: 900; - color: ${props.theme.mode === 'light' ? props.theme.primaryDark : props.theme.primaryLight}; - `} - ${props => (props.selected || (props.mode === 'add' && props.selecting)) && ` - color: ${props.otherMonth ? 'rgba(255,255,255,.5)' : '#FFF'}; - background-color: ${props.theme.primary}; - `} - ${props => props.mode === 'remove' && props.selecting && ` - background-color: ${props.theme.primaryBackground}; - color: ${props.isToday ? props.theme.primaryDark : (props.otherMonth ? props.theme.primaryLight : 'inherit')}; - `} + ${props => props.otherMonth && ` + color: ${props.theme.mode === 'light' ? props.theme.primaryLight : props.theme.primaryDark}; + `} + ${props => props.isToday && ` + font-weight: 900; + color: ${props.theme.mode === 'light' ? props.theme.primaryDark : props.theme.primaryLight}; + `} + ${props => (props.selected || (props.mode === 'add' && props.selecting)) && ` + color: ${props.otherMonth ? 'rgba(255,255,255,.5)' : '#FFF'}; + background-color: ${props.theme.primary}; + `} + ${props => props.mode === 'remove' && props.selecting && ` + background-color: ${props.theme.primaryBackground}; + color: ${props.isToday ? props.theme.primaryDark : (props.otherMonth ? props.theme.primaryLight : 'inherit')}; + `} `; diff --git a/crabfit-frontend/src/components/Center/Center.ts b/crabfit-frontend/src/components/Center/Center.ts index 0d691d0..bd722ff 100644 --- a/crabfit-frontend/src/components/Center/Center.ts +++ b/crabfit-frontend/src/components/Center/Center.ts @@ -1,9 +1,9 @@ import styled from '@emotion/styled'; const Center = styled.div` - display: flex; - align-items: center; - justify-content: center; + display: flex; + align-items: center; + justify-content: center; `; export default Center; diff --git a/crabfit-frontend/src/components/Donate/Donate.tsx b/crabfit-frontend/src/components/Donate/Donate.tsx index 85ef132..1a2d0ef 100644 --- a/crabfit-frontend/src/components/Donate/Donate.tsx +++ b/crabfit-frontend/src/components/Donate/Donate.tsx @@ -96,9 +96,9 @@ const Donate = () => { }; return ( - - + >{t('donate.button')} { {t('donate.options.$10')} {t('donate.options.choose')} - + ); } diff --git a/crabfit-frontend/src/components/Donate/donateStyle.ts b/crabfit-frontend/src/components/Donate/donateStyle.ts index ad32073..0353637 100644 --- a/crabfit-frontend/src/components/Donate/donateStyle.ts +++ b/crabfit-frontend/src/components/Donate/donateStyle.ts @@ -7,7 +7,7 @@ export const Wrapper = styled.div` `; export const Options = styled.div` - position: absolute; + position: absolute; bottom: calc(100% + 20px); right: 0; background-color: ${props => props.theme.background}; diff --git a/crabfit-frontend/src/components/Egg/Egg.tsx b/crabfit-frontend/src/components/Egg/Egg.tsx index afa2e82..0d65643 100644 --- a/crabfit-frontend/src/components/Egg/Egg.tsx +++ b/crabfit-frontend/src/components/Egg/Egg.tsx @@ -7,14 +7,14 @@ const Egg = ({ eggKey, onClose }) => { const [isLoading, setIsLoading] = useState(true); return ( - onClose()}> - onClose()}> + setIsLoading(true)} onLoad={() => setIsLoading(false)} /> {isLoading && } - + ); } diff --git a/crabfit-frontend/src/components/Egg/eggStyle.ts b/crabfit-frontend/src/components/Egg/eggStyle.ts index 19ac1f3..2aebe29 100644 --- a/crabfit-frontend/src/components/Egg/eggStyle.ts +++ b/crabfit-frontend/src/components/Egg/eggStyle.ts @@ -1,7 +1,7 @@ import styled from '@emotion/styled'; export const Wrapper = styled.div` - position: fixed; + position: fixed; background: rgba(0,0,0,.6); top: 0; left: 0; @@ -17,7 +17,7 @@ export const Wrapper = styled.div` `; export const Image = styled.img` - max-width: 80%; - max-height: 80%; + max-width: 80%; + max-height: 80%; position: absolute; `; diff --git a/crabfit-frontend/src/components/Error/Error.tsx b/crabfit-frontend/src/components/Error/Error.tsx index 0d51039..0d103a0 100644 --- a/crabfit-frontend/src/components/Error/Error.tsx +++ b/crabfit-frontend/src/components/Error/Error.tsx @@ -1,17 +1,17 @@ import { Wrapper, CloseButton } from './errorStyle'; const Error = ({ - children, - onClose, + children, + onClose, open = true, - ...props + ...props }) => ( - - {children} - - - - + + {children} + + + + ); export default Error; diff --git a/crabfit-frontend/src/components/Error/errorStyle.ts b/crabfit-frontend/src/components/Error/errorStyle.ts index 59f43df..201001e 100644 --- a/crabfit-frontend/src/components/Error/errorStyle.ts +++ b/crabfit-frontend/src/components/Error/errorStyle.ts @@ -1,14 +1,14 @@ import styled from '@emotion/styled'; export const Wrapper = styled.div` - border-radius: 3px; - background-color: ${props => props.theme.error}; - color: #FFFFFF; - padding: 0 16px; - display: flex; - align-items: center; - justify-content: space-between; - font-size: 18px; + border-radius: 3px; + background-color: ${props => props.theme.error}; + color: #FFFFFF; + padding: 0 16px; + display: flex; + align-items: center; + justify-content: space-between; + font-size: 18px; opacity: 0; max-height: 0; margin: 0; @@ -30,14 +30,14 @@ export const Wrapper = styled.div` `; export const CloseButton = styled.button` - border: 0; - background: none; - height: 30px; - width: 30px; - cursor: pointer; - color: inherit; - display: flex; - align-items: center; - justify-content: center; - margin-left: 16px; + border: 0; + background: none; + height: 30px; + width: 30px; + cursor: pointer; + color: inherit; + display: flex; + align-items: center; + justify-content: center; + margin-left: 16px; `; diff --git a/crabfit-frontend/src/components/Footer/footerStyle.ts b/crabfit-frontend/src/components/Footer/footerStyle.ts index 4e04db7..1d09889 100644 --- a/crabfit-frontend/src/components/Footer/footerStyle.ts +++ b/crabfit-frontend/src/components/Footer/footerStyle.ts @@ -1,12 +1,12 @@ import styled from '@emotion/styled'; export const Wrapper = styled.footer` - width: 600px; - margin: 20px auto; - max-width: calc(100% - 60px); - display: flex; - align-items: center; - justify-content: space-between; + width: 600px; + margin: 20px auto; + max-width: calc(100% - 60px); + display: flex; + align-items: center; + justify-content: space-between; ${props => props.small && ` margin: 60px auto 0; diff --git a/crabfit-frontend/src/components/GoogleCalendar/GoogleCalendar.tsx b/crabfit-frontend/src/components/GoogleCalendar/GoogleCalendar.tsx index 335f779..5b6f871 100644 --- a/crabfit-frontend/src/components/GoogleCalendar/GoogleCalendar.tsx +++ b/crabfit-frontend/src/components/GoogleCalendar/GoogleCalendar.tsx @@ -93,11 +93,11 @@ const GoogleCalendar = ({ timeZone, timeMin, timeMax, onImport }) => { } }, [signedIn]); - return ( + return ( <> {!signedIn ? (
- - + - + ); } diff --git a/crabfit-frontend/src/pages/Create/Create.tsx b/crabfit-frontend/src/pages/Create/Create.tsx index d84e2a9..f63213f 100644 --- a/crabfit-frontend/src/pages/Create/Create.tsx +++ b/crabfit-frontend/src/pages/Create/Create.tsx @@ -9,21 +9,21 @@ import timezone from 'dayjs/plugin/timezone'; import customParseFormat from 'dayjs/plugin/customParseFormat'; import { - TextField, - CalendarField, - TimeRangeField, - SelectField, - Button, - Error, + TextField, + CalendarField, + TimeRangeField, + SelectField, + Button, + Error, Recents, Footer, } from 'components'; import { - StyledMain, - CreateForm, - TitleSmall, - TitleLarge, + StyledMain, + CreateForm, + TitleSmall, + TitleLarge, P, OfflineMessage, ShareInfo, @@ -39,14 +39,14 @@ dayjs.extend(timezone); dayjs.extend(customParseFormat); const Create = ({ offline }) => { - const { register, handleSubmit, setValue } = useForm({ - defaultValues: { - timezone: Intl.DateTimeFormat().resolvedOptions().timeZone, - }, - }); - const [isLoading, setIsLoading] = useState(false); - const [error, setError] = useState(null); - const [createdEvent, setCreatedEvent] = useState(null); + const { register, handleSubmit, setValue } = useForm({ + defaultValues: { + timezone: Intl.DateTimeFormat().resolvedOptions().timeZone, + }, + }); + const [isLoading, setIsLoading] = useState(false); + const [error, setError] = useState(null); + const [createdEvent, setCreatedEvent] = useState(null); const [copied, setCopied] = useState(null); const [showFooter, setShowFooter] = useState(true); @@ -55,11 +55,11 @@ const Create = ({ offline }) => { const addRecent = useRecentsStore(state => state.addRecent); - useEffect(() => { + useEffect(() => { if (window.self === window.top) { push('/'); } - document.title = 'Create a Crab Fit'; + document.title = 'Create a Crab Fit'; if (window.parent) { window.parent.postMessage('crabfit-create', '*'); @@ -71,67 +71,67 @@ const Create = ({ offline }) => { once: true }); } - }, [push]); + }, [push]); - const onSubmit = async data => { - setIsLoading(true); - setError(null); - try { - const { start, end } = JSON.parse(data.times); - const dates = JSON.parse(data.dates); + const onSubmit = async data => { + setIsLoading(true); + setError(null); + try { + const { start, end } = JSON.parse(data.times); + const dates = JSON.parse(data.dates); - if (dates.length === 0) { - return setError(t('home:form.errors.no_dates')); - } + if (dates.length === 0) { + return setError(t('home:form.errors.no_dates')); + } const isSpecificDates = typeof dates[0] === 'string' && dates[0].length === 8; - if (start === end) { - return setError(t('home:form.errors.same_times')); - } + if (start === end) { + return setError(t('home:form.errors.same_times')); + } - let times = dates.reduce((times, date) => { - let day = []; - for (let i = start; i < (start > end ? 24 : end); i++) { + let times = dates.reduce((times, date) => { + let day = []; + for (let i = start; i < (start > end ? 24 : end); i++) { if (isSpecificDates) { - day.push( - dayjs.tz(date, 'DDMMYYYY', data.timezone) - .hour(i).minute(0).utc().format('HHmm-DDMMYYYY') - ); + day.push( + dayjs.tz(date, 'DDMMYYYY', data.timezone) + .hour(i).minute(0).utc().format('HHmm-DDMMYYYY') + ); } else { day.push( dayjs().tz(data.timezone) .day(date).hour(i).minute(0).utc().format('HHmm-d') ); } - } - if (start > end) { - for (let i = 0; i < end; i++) { + } + if (start > end) { + for (let i = 0; i < end; i++) { if (isSpecificDates) { - day.push( - dayjs.tz(date, 'DDMMYYYY', data.timezone) - .hour(i).minute(0).utc().format('HHmm-DDMMYYYY') - ); + day.push( + dayjs.tz(date, 'DDMMYYYY', data.timezone) + .hour(i).minute(0).utc().format('HHmm-DDMMYYYY') + ); } else { day.push( dayjs().tz(data.timezone) .day(date).hour(i).minute(0).utc().format('HHmm-d') ); } - } - } - return [...times, ...day]; - }, []); + } + } + return [...times, ...day]; + }, []); - if (times.length === 0) { - return setError(t('home:form.errors.no_time')); - } + if (times.length === 0) { + return setError(t('home:form.errors.no_time')); + } - const response = await api.post('/event', { - event: { - name: data.name, - times: times, + const response = await api.post('/event', { + event: { + name: data.name, + times: times, timezone: data.timezone, - }, - }); + }, + }); setCreatedEvent(response.data); addRecent({ id: response.data.id, @@ -141,19 +141,19 @@ const Create = ({ offline }) => { gtag('event', 'create_event', { 'event_category': 'create', }); - } catch (e) { - setError(t('home:form.errors.unknown')); - console.error(e); - } finally { - setIsLoading(false); - } - }; + } catch (e) { + setError(t('home:form.errors.unknown')); + console.error(e); + } finally { + setIsLoading(false); + } + }; - return ( - <> - - {t('home:create')} - CRAB FIT + return ( + <> + + {t('home:create')} + CRAB FIT {createdEvent ? ( @@ -173,10 +173,10 @@ const Create = ({ offline }) => { } title={!!navigator.clipboard ? t('event:nav.title') : ''} >{copied ?? `https://crab.fit/${createdEvent?.id}`} - + {/* eslint-disable-next-line */} - Click the link above to copy it to your clipboard, or share via gtag('event', 'send_email', { 'event_category': 'event' })} href={`mailto:?subject=${encodeURIComponent(t('event:nav.email_subject', { event_name: createdEvent?.name }))}&body=${encodeURIComponent(`${t('event:nav.email_body')} https://crab.fit/${createdEvent?.id}`)}`} target="_blank">email. - + Click the link above to copy it to your clipboard, or share via gtag('event', 'send_email', { 'event_category': 'event' })} href={`mailto:?subject=${encodeURIComponent(t('event:nav.email_subject', { event_name: createdEvent?.name }))}&body=${encodeURIComponent(`${t('event:nav.email_body')} https://crab.fit/${createdEvent?.id}`)}`} target="_blank">email. + {showFooter &&