-
Notifications
You must be signed in to change notification settings - Fork 131
Expand file tree
/
Copy pathAnimatedIconButton.tsx
More file actions
80 lines (73 loc) · 2.05 KB
/
AnimatedIconButton.tsx
File metadata and controls
80 lines (73 loc) · 2.05 KB
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
import { useState, MouseEvent } from 'react'
import { uuid } from '@audius/common/utils'
import AnimatedButtonProvider from './AnimatedButtonProvider'
export enum AnimatedIconType {
FAVORITE = 'FAVORITE',
FAVORITE_LIGHT = 'FAVORITE_LIGHT',
REPOST = 'REPOST',
REPOST_LIGHT = 'REPOST_LIGHT'
}
/** Base asset path per icon - theme applied at runtime via useLottieThemeColors */
const animationMap: Record<AnimatedIconType, string> = {
[AnimatedIconType.FAVORITE]: 'iconFavoriteLight',
[AnimatedIconType.REPOST]: 'iconRepostLight',
[AnimatedIconType.FAVORITE_LIGHT]: 'iconFavoriteLighterLight',
[AnimatedIconType.REPOST_LIGHT]: 'iconRepostLighterLight'
}
type AnimatedIconButtonProps = {
onClick?: (e: MouseEvent) => void
href?: string
isDisabled?: boolean
isActive?: boolean
className?: string
wrapperClassName?: string
stopPropagation?: boolean
activeClassName?: string
disabledClassName?: string
icon: AnimatedIconType
/** @deprecated Theme applied at runtime - no longer used */
darkMode?: boolean
isMatrix?: boolean
'aria-label'?: string
}
const AnimatedIconButton = ({
onClick,
href,
className,
wrapperClassName,
activeClassName,
disabledClassName,
icon,
isMatrix = false,
isDisabled = false,
isActive = false,
stopPropagation = false,
'aria-label': ariaLabel,
...rest
}: AnimatedIconButtonProps) => {
const assetPath = animationMap[icon]
const [uniqueKey] = useState(`${uuid()}-${icon}`)
return (
<AnimatedButtonProvider
uniqueKey={uniqueKey}
isActive={isActive}
isDisabled={isDisabled}
isMatrix={isMatrix}
onClick={onClick ?? (() => {})}
href={href}
iconJSON={() =>
import(`../../assets/animations/${assetPath}.json`).then(
(m) => m.default
)
}
activeClassName={activeClassName}
disabledClassName={disabledClassName}
className={className}
wrapperClassName={wrapperClassName}
stopPropagation={stopPropagation}
aria-label={ariaLabel}
{...rest}
/>
)
}
export default AnimatedIconButton