generated from taylorbryant/gatsby-starter-tailwind
-
-
Notifications
You must be signed in to change notification settings - Fork 114
/
Triggers.tsx
146 lines (133 loc) · 4.52 KB
/
Triggers.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
'use client'
import { useState, useCallback } from 'react'
import { Trash } from '@phosphor-icons/react/dist/ssr'
import { PlusIcon, PlusCircleIcon } from '@heroicons/react/20/solid'
import { MobileDialog, DialogContent, DialogTrigger } from '../ui/MobileDialog'
import DeleteAreaForm, { DeleteAreaProps } from './DeleteAreaForm'
import AddAreaForm, { AddAreaFormProps } from './AddChildAreaForm'
import { toast } from 'react-toastify'
import Tooltip from '../ui/Tooltip'
export type DeleteAreaTriggerProps = DeleteAreaProps & {
disabled?: boolean
children?: JSX.Element }
/**
* A high level component that triggers the Delete Area dialog. You can pass an optional nested component to customize the look and feel of the trigger button.
*
* Example:
* ```
* <DeleteAreaTrigger>
* <DeleteAreaTriggerButtonSm disabled={!canEdit}/>
* </DeleteAreaTrigger>
* ```
* @param areaName j
*/
export const DeleteAreaTrigger = ({ areaName, areaUuid, parentUuid, disabled = false, returnToParentPageAfterDelete, onSuccess, children }: DeleteAreaTriggerProps): JSX.Element => {
const [isOpen, setOpen] = useState(false)
const onSuccessHandler = useCallback((): void => {
setOpen(false)
toast.info(`Area '${areaName}' deleted.`)
if (onSuccess != null) {
onSuccess()
}
}, [])
return (
<MobileDialog modal open={isOpen} onOpenChange={setOpen}>
{children == null
? <DeleteAreaTriggerButtonDefault disabled={disabled} />
: children}
<DialogContent title='Delete area'>
<DeleteAreaForm
areaName={areaName}
areaUuid={areaUuid}
parentUuid={parentUuid}
onSuccess={onSuccessHandler}
returnToParentPageAfterDelete={returnToParentPageAfterDelete}
/>
</DialogContent>
</MobileDialog>
)
}
export interface TriggerButtonProps {
disabled: boolean
}
const DeleteAreaTriggerButtonDefault = ({ disabled }: TriggerButtonProps): JSX.Element => (
<DialogTrigger
className='btn btn-primary btn-sm btn-outline px-6'
disabled={disabled}
type='button'
>
Delete
</DialogTrigger>
)
/**
* A small delete trigger button
*/
export const DeleteAreaTriggerButtonSm = ({ disabled }: TriggerButtonProps): JSX.Element => (
disabled
? (
<Tooltip
content='Please delete child areas or climbs first.' enabled={disabled}
>
<div className='btn btn-ghost btn-circle btn-primary btn-disabled btn-sm'>
<Trash size={18} />
</div>
</Tooltip>)
: (
<DialogTrigger
data-no-dnd='true'
disabled={disabled}
type='button'
asChild
>
<button className='z-50 btn btn-ghost btn-circle btn-sm'>
<Trash size={18} />
</button>
</DialogTrigger>)
)
export type AddAreaTriggerProps = Omit<AddAreaFormProps, 'onError'> & { children?: JSX.Element }
/**
* A high level component that triggers the Add Area dialog. See {@link DeleteAreaTrigger} for a customization example.
*/
export const AddAreaTrigger = ({ parentName, parentUuid, onSuccess, children }: AddAreaTriggerProps): JSX.Element => {
const [hasChanges, setHasChanges] = useState(false)
const onOpenChange = (isOpen: boolean): void => {
if (!isOpen && hasChanges && onSuccess != null) {
onSuccess()
}
}
return (
<MobileDialog modal onOpenChange={onOpenChange}>
{children == null
? <AddAreaTriggerButtonCTA />
: children}
<DialogContent title='Add area'>
<AddAreaForm
parentName={parentName}
parentUuid={parentUuid}
onSuccess={() => setHasChanges(true)}
/>
</DialogContent>
</MobileDialog>
)
}
/**
* Default trigger button
*/
const AddAreaTriggerButtonCTA = (): JSX.Element => (
<DialogTrigger className='flex flex-row items-center gap-4'>
<div className='border-secondary border-dashed border-4 w-24 h-24 hover:bg-secondary hover:bg-opacity-60 rounded-box flex items-center justify-center'>
<PlusIcon className='w-8 h-8 text-secondary' />
</div>
<div>Add New Area</div>
</DialogTrigger>
)
export const AddAreaTriggerButtonMd = (): JSX.Element => (
<DialogTrigger data-no-dnd='true' className='btn btn-sm w-full md:btn-wide btn-solid btn-secondary border-dashed border-2 gap-2'>
<PlusIcon className='stroke-2 w-5 h-5' data-no-dnd='true' /> New Area
</DialogTrigger>
)
export const AddAreaTriggerButtonSm = (): JSX.Element => (
<DialogTrigger className='btn btn-square btn-sm btn-ghost'>
<PlusCircleIcon className='w-6 h-6 text-base-content/80' />
</DialogTrigger>
)