@schedule-x/react 0.4.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/.husky/pre-commit +5 -0
  2. package/LICENSE +7 -0
  3. package/cypress/e2e/001-smoke.cy.ts +1 -1
  4. package/cypress/e2e/002-custom-events.cy.ts +33 -0
  5. package/cypress/pages/{001-smoke.html → 001-smoke/001-smoke.html} +1 -1
  6. package/cypress/pages/{001-smoke.tsx → 001-smoke/001-smoke.tsx} +2 -2
  7. package/cypress/pages/002-custom-events/002-custom-events.html +21 -0
  8. package/cypress/pages/002-custom-events/002-custom-events.tsx +65 -0
  9. package/cypress/pages/002-custom-events/components/CustomDateGridEvent.tsx +26 -0
  10. package/cypress/pages/002-custom-events/components/CustomMonthAgendaEvent.tsx +26 -0
  11. package/cypress/pages/002-custom-events/components/CustomMonthGridEvent.tsx +26 -0
  12. package/cypress/pages/002-custom-events/components/CustomTimeGridEvent.tsx +30 -0
  13. package/development/App.tsx +36 -4
  14. package/development/components/CustomDateGridEvent.tsx +26 -0
  15. package/development/components/CustomTimeGridEvent.tsx +29 -0
  16. package/development/index.css +2 -2
  17. package/dist/index.cjs.js +30 -5
  18. package/dist/index.js +31 -7
  19. package/dist/types/index.d.ts +2 -1
  20. package/dist/types/schedule-x-calendar.d.ts +14 -0
  21. package/dist/types/types/custom-components.d.ts +6 -0
  22. package/package.json +9 -6
  23. package/src/index.tsx +4 -1
  24. package/src/schedule-x-calendar.tsx +79 -0
  25. package/src/types/custom-components.ts +8 -0
  26. package/dist/assets/index-I1yYmKKo.js +0 -40
  27. package/dist/assets/index-tSapxTsJ.css +0 -1
  28. package/dist/index.html +0 -14
  29. package/dist/types/calendar.d.ts +0 -6
  30. package/src/calendar.tsx +0 -20
@@ -0,0 +1,79 @@
1
+ import { CalendarApp } from '@schedule-x/calendar'
2
+ import React, { createElement, Fragment, useEffect, useState } from 'react'
3
+ import { createPortal } from 'react-dom'
4
+ import {
5
+ CustomComponentMeta,
6
+ CustomComponentsMeta,
7
+ } from './types/custom-components.ts'
8
+
9
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
10
+ type ReactComponent = React.ComponentType<any>
11
+
12
+ type props = {
13
+ calendarApp: CalendarApp
14
+ customComponents?: {
15
+ timeGridEvent?: ReactComponent
16
+ dateGridEvent?: ReactComponent
17
+ monthGridEvent?: ReactComponent
18
+ monthAgendaEvent?: ReactComponent
19
+ }
20
+ }
21
+
22
+ const createCustomComponentFn =
23
+ (
24
+ setCustomComponent: (component: CustomComponentMeta) => void,
25
+ customComponent: ReactComponent
26
+ ) =>
27
+ (wrapperElement: HTMLElement, props: Record<string, unknown>) => {
28
+ setCustomComponent({
29
+ Component: createElement(customComponent, props),
30
+ wrapperElement,
31
+ })
32
+ }
33
+
34
+ export function ScheduleXCalendar({ calendarApp, customComponents }: props) {
35
+ const randomId = 'sx' + Math.random().toString(36).substring(2, 11)
36
+ const [customComponentsMeta, setCustomComponentsMeta] =
37
+ useState<CustomComponentsMeta>([])
38
+
39
+ const setComponent = (component: CustomComponentMeta) => {
40
+ setCustomComponentsMeta((prev) => {
41
+ const newComponents = [...prev]
42
+ const ccid = component.wrapperElement.dataset.ccid
43
+ const existingComponent = newComponents.find(
44
+ (c) => c.wrapperElement.dataset.ccid === ccid
45
+ )
46
+
47
+ if (existingComponent) {
48
+ newComponents.splice(newComponents.indexOf(existingComponent), 1)
49
+ }
50
+
51
+ return [...newComponents, component]
52
+ })
53
+ }
54
+
55
+ useEffect(() => {
56
+ for (const [componentName, Component] of Object.entries(
57
+ customComponents || {}
58
+ )) {
59
+ calendarApp._setCustomComponentFn(
60
+ componentName as 'timeGridEvent' | 'dateGridEvent',
61
+ createCustomComponentFn(setComponent, Component)
62
+ )
63
+ }
64
+
65
+ calendarApp.render(document.getElementById(randomId) as HTMLElement)
66
+ }, [calendarApp, randomId, customComponents])
67
+
68
+ return (
69
+ <>
70
+ <Fragment>
71
+ <div className="sx-react-calendar-wrapper" id={randomId}></div>
72
+
73
+ {customComponentsMeta.map(({ Component, wrapperElement }) => {
74
+ return createPortal(Component, wrapperElement)
75
+ })}
76
+ </Fragment>
77
+ </>
78
+ )
79
+ }
@@ -0,0 +1,8 @@
1
+ import { ReactElement } from 'react'
2
+
3
+ export type CustomComponentMeta = {
4
+ Component: ReactElement
5
+ wrapperElement: HTMLElement
6
+ }
7
+
8
+ export type CustomComponentsMeta = CustomComponentMeta[]