1
- import { useMemo , useState } from 'react'
1
+ import { useCallback , useEffect , useMemo , useState } from 'react'
2
+ import { toast } from 'react-hot-toast'
2
3
3
4
import trashIcon from '@iconify/icons-codicon/trash'
4
5
import arrowLeftRightLine from '@iconify/icons-ri/arrow-left-right-line'
@@ -17,8 +18,10 @@ import {
17
18
LoadingButton ,
18
19
ToolbarTooltip
19
20
} from '@workduck-io/mex-components'
21
+ import { tinykeys } from '@workduck-io/tinykeys'
20
22
21
23
import {
24
+ PrimaryText ,
22
25
ShortcutToken ,
23
26
ShortcutTokens ,
24
27
TaskHeader as StyledTaskHeader ,
@@ -40,6 +43,68 @@ interface ViewHeaderProps {
40
43
cardSelected ?: boolean // * To show actions related to selected Item
41
44
}
42
45
46
+ const ViewChangeStatus = ( { viewId } ) => {
47
+ const views = useViewStore ( ( store ) => store . views )
48
+
49
+ const { viewType, sortOrder, globalJoin, sortType, entities, currentFilters, groupBy } = useViewFilters ( )
50
+ const { getView, updateView } = useViews ( )
51
+
52
+ const isCurrentViewChanged = useMemo ( ( ) => {
53
+ const currentView = getView ( viewId )
54
+ return ! (
55
+ JSON . stringify ( currentFilters ) === JSON . stringify ( currentView ?. filters ) &&
56
+ viewType === currentView ?. viewType &&
57
+ groupBy === currentView ?. groupBy &&
58
+ sortType === currentView ?. sortType &&
59
+ sortOrder === currentView ?. sortOrder &&
60
+ entities === currentView ?. entities
61
+ )
62
+ } , [ currentFilters , viewType , entities , groupBy , sortType , sortOrder , views , viewId ] )
63
+
64
+ const onSaveView = useCallback (
65
+ async ( viewId : string ) => {
66
+ const oldview = getView ( viewId )
67
+
68
+ const newView = {
69
+ ...oldview ,
70
+ filters : currentFilters ,
71
+ viewType,
72
+ globalJoin,
73
+ groupBy,
74
+ entities,
75
+ sortOrder,
76
+ sortType
77
+ }
78
+
79
+ try {
80
+ await updateView ( newView )
81
+ toast ( 'View Saved' )
82
+ } catch ( err ) {
83
+ console . error ( 'Unable to save view' , err )
84
+ toast ( 'Unable to save view' )
85
+ }
86
+ } ,
87
+ [ currentFilters , viewType , groupBy , sortType , sortOrder , entities ]
88
+ )
89
+
90
+ useEffect ( ( ) => {
91
+ const unsubscribe = tinykeys ( window , {
92
+ '$mod+KeyS' : ( e ) => {
93
+ e . stopPropagation ( )
94
+ e . preventDefault ( )
95
+
96
+ if ( isCurrentViewChanged ) {
97
+ onSaveView ( viewId )
98
+ }
99
+ }
100
+ } )
101
+
102
+ return ( ) => unsubscribe ( )
103
+ } , [ viewId , onSaveView , isCurrentViewChanged ] )
104
+
105
+ return < PrimaryText > { isCurrentViewChanged && '*' } </ PrimaryText >
106
+ }
107
+
43
108
const ViewHeader = ( { cardSelected = false } : ViewHeaderProps ) => {
44
109
const [ deleting , setDeleting ] = useState ( false )
45
110
@@ -50,20 +115,10 @@ const ViewHeader = ({ cardSelected = false }: ViewHeaderProps) => {
50
115
51
116
const { goTo } = useRouting ( )
52
117
const { deleteView } = useViews ( )
118
+
53
119
const [ source , target ] = useSingleton ( )
54
120
const { viewType, sortOrder, globalJoin, sortType, entities, currentFilters, groupBy } = useViewFilters ( )
55
121
56
- const isCurrentViewChanged = useMemo ( ( ) => {
57
- return ! (
58
- JSON . stringify ( currentFilters ) === JSON . stringify ( view ?. filters ) &&
59
- viewType === view ?. viewType &&
60
- groupBy === view ?. groupBy &&
61
- sortType === view ?. sortType &&
62
- sortOrder === view ?. sortOrder &&
63
- entities === view ?. entities
64
- )
65
- } , [ currentFilters , viewType , groupBy , sortType , sortOrder ] )
66
-
67
122
const handleUpdateView = ( ) => {
68
123
openTaskViewModal ( {
69
124
filters : currentFilters ,
@@ -96,7 +151,6 @@ const ViewHeader = ({ cardSelected = false }: ViewHeaderProps) => {
96
151
97
152
const handleCloneView = ( ) => {
98
153
const { id, filters, ...properties } = view
99
- console . log ( 'cloning' )
100
154
openTaskViewModal ( {
101
155
cloneViewId : view ?. id ,
102
156
filters,
@@ -128,7 +182,7 @@ const ViewHeader = ({ cardSelected = false }: ViewHeaderProps) => {
128
182
< TaskViewTitle >
129
183
< Icon icon = { stackLine } />
130
184
< span > { view ?. title } </ span >
131
- { isCurrentViewChanged && ! isDefault && '*' }
185
+ { view ?. id && ! isDefault && < ViewChangeStatus viewId = { view ?. id } /> }
132
186
</ TaskViewTitle >
133
187
< TaskViewControls >
134
188
{ ! isDefault && (
0 commit comments