UNPKG

time-calendar

Version:

Shows the schedule, increases and decreases the calendar day, changing the schedule

1 lines 6.4 kB
{"version":3,"sources":["../src/components/Time/Time.styled.ts","../src/components/Time/Time.tsx","../src/components/Calendar/Calendar.tsx","../src/components/Calendar/Calendar.styled.ts","../src/hooks/useDateFnsLocale.ts"],"sourcesContent":["import styled from \"styled-components\";\n\nexport const Wrapper = styled.div`\n display: grid;\n grid-template-columns: repeat(auto-fill, 80px);\n gap: 10px;\n`\n\nexport const Cell = styled.div`\n padding: 8px 16px;\n border-radius: 16px;\n border: 1px solid rgba(197, 193, 193, 0.77);\n background-color: #fff;\n text-align: center;\n font-size: 14px;\n font-weight: 400;\n\n &:hover {\n background-color: #f6f6f6;\n border: 0;\n cursor: pointer;\n }\n`","import { Cell, Wrapper } from './Time.styled'\n\ntype TimeProps = {\n onClick: () => void;\n cells: string[],\n className?: string,\n style?: React.CSSProperties,\n delegated?: React.HTMLAttributes<HTMLDivElement>,\n};\n\nconst Time: React.FC<TimeProps> = ({ onClick, cells, className = \"\", style = {}, ...delegated }) => {\n return (\n <Wrapper className={className} style={style} {...delegated}>\n {cells.map(c => (\n <Cell onClick={onClick}>{c}</Cell>)\n )}\n </Wrapper>\n )\n}\n\nexport default Time","import { useState } from \"react\";\nimport Time from \"../Time/Time\"\nimport { FormatedDate, Header, Nav, Wrapper, NavWrapper } from \"./Calendar.styled\"\nimport { format, addDays, subDays } from 'date-fns';\nimport useDateFnsLocale from \"../../hooks/useDateFnsLocale\";\n\ntype CalendarTypes = {\n onClickTime: () => void,\n shedule: { [key: string]: string[] },\n initialDate?: Date,\n localeCode?: string,\n className?: string,\n style?: React.CSSProperties,\n delegated?: React.HTMLAttributes<HTMLDivElement>,\n loadingFallback?: React.ReactNode,\n errorFallback?: (error: Error) => React.ReactNode,\n}\n\nconst Calendar: React.FC<CalendarTypes> = ({ onClickTime, shedule, loadingFallback, errorFallback, initialDate = new Date(), localeCode = \"en-US\", className = \"\", style = {}, ...delegated }) => {\n const { loading, error, locale } = useDateFnsLocale(localeCode)\n const [date, setDate] = useState(initialDate)\n\n if (loading) return loadingFallback ?? <div>...loading</div>\n if (error) return errorFallback?.(error) ?? <div>{error.message}</div>\n\n return (\n <Wrapper className={className} style={style} {...delegated}>\n <Header>\n <FormatedDate>{locale ? format(date, \"d MMMM yyyy\", { locale: locale }) : format(date, \"d MMMM yyyy\" )}</FormatedDate>\n <NavWrapper>\n <Nav onClick={() => setDate(initialDate)}>↻</Nav>\n <Nav onClick={() => setDate(prev => subDays(prev, 1))}>ᐊ</Nav>\n <Nav onClick={() => setDate(prev => addDays(prev, 1))}>ᐅ</Nav>\n </NavWrapper>\n </Header>\n <Time onClick={onClickTime} cells={shedule[format(date, \"dd.MM.yyyy\")]} />\n </Wrapper>\n )\n}\n\nexport default Calendar","import styled from \"styled-components\";\n\nexport const Wrapper = styled.div`\n max-width: 350px;\n border-radius: 12px;\n box-shadow: 0px 4px 16px 0px #0000000A;\n background-color: white;\n padding: 10px;\n`\n\nexport const Header = styled.div`\n margin-bottom: 16px;\n display: flex;\n justify-content: space-between;\n`\n\nexport const FormatedDate = styled.span`\n font-size: 16px;\n font-weight: 600;\n`\n\nexport const NavWrapper = styled.div`\n display: flex;\n justify-content: space-between;\n gap: 10px;\n`\n\nexport const Nav = styled.button`\n padding: 6px 10px;\n border-radius: 12px;\n background-color: rgba(197, 193, 193, 0.77);\n border: 0;\n\n &:hover {\n background-color: #f6f6f6;\n border: 0;\n cursor: pointer;\n }\n`\n\n","import { useState, useEffect } from \"react\"\nimport type { Locale } from 'date-fns'\nimport { localeLoaders } from \"../localeLoaders\";\n\nconst localeCache: Record<string, Locale> = {}\n\ninterface UseDateFnsLocaleResult {\n loading: boolean;\n locale: Locale | null;\n error: Error | null;\n}\n\nconst useDateFnsLocale = (localeCode: string): UseDateFnsLocaleResult => {\n const [loading, setLoading] = useState<boolean>(false)\n const [locale, setLocale] = useState<Locale | null>(null)\n const [error, setError] = useState<Error | null>(null)\n\n useEffect(() => {\n if (!localeCode) throw new Error(\"Locale code must be provided\")\n\n if (localeCache[localeCode]) {\n setLocale(localeCache[localeCode])\n return\n }\n\n setLoading(true)\n\n const loadLocale = async () => {\n try {\n const loadedLocale = await localeLoaders[localeCode]();\n localeCache[localeCode] = loadedLocale;\n setLocale(loadedLocale);\n } catch (err: any) {\n setError(Error(`Locale ${localeCode} not found, fallback to en-US`))\n\n try {\n const loadedLocale = await localeLoaders[\"en-US\"]();\n localeCache[localeCode] = loadedLocale;\n localeCache['en-US'] = loadedLocale;\n setLocale(loadedLocale);\n } catch (e: any) {\n setLocale(null)\n setError(e)\n }\n } finally {\n setLoading(false)\n }\n }\n\n loadLocale()\n }, [localeCode])\n\n return {\n loading,\n locale,\n error\n }\n}\n\nexport default useDateFnsLocale\n"],"mappings":";AAAA,OAAO,YAAY;AAEZ,IAAM,UAAU,OAAO;AAAA;AAAA;AAAA;AAAA;AAMvB,IAAM,OAAO,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACMX;;;ACdhB,SAAS,YAAAA,iBAAgB;;;ACAzB,OAAOC,aAAY;AAEZ,IAAMC,WAAUD,QAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQvB,IAAM,SAASA,QAAO;AAAA;AAAA;AAAA;AAAA;AAMtB,IAAM,eAAeA,QAAO;AAAA;AAAA;AAAA;AAK5B,IAAM,aAAaA,QAAO;AAAA;AAAA;AAAA;AAAA;AAM1B,IAAM,MAAMA,QAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ADxB1B,SAAS,QAAQ,SAAS,eAAe;;;AEHzC,SAAS,UAAU,iBAAiB;;;AFsBO,gBAAAE,MAO3B,YAP2B;","names":["useState","styled","Wrapper","jsx"]}