1- import  React ,  {  useMemo ,  useState  }  from  'react' ; 
1+ import  React ,  {  useEffect ,   useId ,   useMemo ,  useState  }  from  'react' ; 
22import  {  useResource ,  useStore ,  Version  }  from  '@tomic/react' ; 
33
44import  {  ContainerNarrow  }  from  '../../components/Containers' ; 
@@ -18,21 +18,37 @@ import {
1818  groupVersionsByMonth , 
1919  setResourceToVersion , 
2020}  from  './versionHelpers' ; 
21+ import  {  toast  }  from  'react-hot-toast' ; 
22+ import  {  useNavigateWithTransition  }  from  '../../hooks/useNavigateWithTransition' ; 
23+ import  {  constructOpenURL  }  from  '../../helpers/navigation' ; 
2124
2225/** Shows an activity log of previous versions */ 
2326export  function  History ( ) : JSX . Element  { 
2427  const  store  =  useStore ( ) ; 
28+   const  navigate  =  useNavigateWithTransition ( ) ; 
29+   const  scrollerTitleId  =  useId ( ) ; 
30+ 
2531  const  [ subject ]  =  useCurrentSubject ( ) ; 
2632  const  resource  =  useResource ( subject ) ; 
2733  const  {  versions,  loading,  error }  =  useVersions ( resource ) ; 
28-   const  [ selectedVersion ,  setSelectedVersion ]  =  useState < Version  |  undefined > ( 
29-     versions [ versions . length  -  1 ] , 
30-   ) ; 
34+   const  [ selectedVersion ,  setSelectedVersion ]  =  useState < Version  |  undefined > ( ) ; 
3135
3236  const  groupedVersions : { 
3337    [ key : string ] : Version [ ] ; 
3438  }  =  useMemo ( ( )  =>  groupVersionsByMonth ( dedupeVersions ( versions ) ) ,  [ versions ] ) ; 
3539
40+   useEffect ( ( )  =>  { 
41+     setSelectedVersion ( versions [ versions . length  -  1 ] ) ; 
42+   } ,  [ versions ] ) ; 
43+ 
44+   const  setResourceToCurrentVersion  =  async  ( )  =>  { 
45+     if  ( selectedVersion  &&  subject )  { 
46+       await  setResourceToVersion ( resource ,  selectedVersion ,  store ) ; 
47+       toast . success ( 'Resource version updated' ) ; 
48+       navigate ( constructOpenURL ( subject ) ) ; 
49+     } 
50+   } ; 
51+ 
3652  if  ( loading )  { 
3753    return  < ContainerNarrow > Loading history of { subject } ...</ ContainerNarrow > ; 
3854  } 
@@ -48,28 +64,24 @@ export function History(): JSX.Element {
4864  return  ( 
4965    < SplitView  about = { subject } > 
5066      < CurrentItem > 
51-         < Column > 
67+         < Column   fullHeight > 
5268          < Title  resource = { resource }  prefix = 'History of'  link  /> 
5369          { selectedVersion  &&  selectedVersion ?. resource  &&  ( 
5470            < > 
5571              < VersionTitle  version = { selectedVersion }  /> 
56-               < Card > 
72+               < StyledCard > 
5773                < ResourceCardDefault  resource = { selectedVersion . resource }  /> 
58-               </ Card > 
59-               < Button 
60-                 onClick = { ( )  => 
61-                   setResourceToVersion ( resource ,  selectedVersion ,  store ) 
62-                 } 
63-               > 
74+               </ StyledCard > 
75+               < Button  onClick = { setResourceToCurrentVersion } > 
6476                Make current version
6577              </ Button > 
6678            </ > 
6779          ) } 
6880        </ Column > 
6981      </ CurrentItem > 
70-       < Scroller > 
82+       < ScrollerSection   aria-labelledby = { scrollerTitleId } > 
7183        < Column > 
72-           < h2 > Versions</ h2 > 
84+           < ScrollerTitle   id = { scrollerTitleId } > Versions</ ScrollerTitle > 
7385          { Object . entries ( groupedVersions ) . map ( ( [ key ,  group ] )  =>  ( 
7486            < React . Fragment  key = { key } > 
7587              < GroupHeading > { key } </ GroupHeading > 
@@ -84,30 +96,38 @@ export function History(): JSX.Element {
8496            </ React . Fragment > 
8597          ) ) } 
8698        </ Column > 
87-       </ Scroller > 
99+       </ ScrollerSection > 
88100    </ SplitView > 
89101  ) ; 
90102} 
91103
92- const  SplitView  =  styled . div ` 
104+ const  SplitView  =  styled . main ` 
93105  display: flex; 
94106  /* Fills entire view on all devices */ 
95107  width: 100%; 
96108  height: 100%; 
97-   height: calc(100vh - 4rem); 
109+   height: calc(100vh - 5rem); 
110+   padding: ${ p  =>  p . theme . margin }  rem; 
111+   gap: ${ p  =>  p . theme . margin }  rem; 
112+ ` ; 
113+ 
114+ const  StyledCard  =  styled ( Card ) ` 
115+   flex: 1; 
116+   overflow: auto; 
98117` ; 
99118
100119const  CurrentItem  =  styled . div ` 
101120  flex: 1; 
102-   padding: 1rem; 
103121` ; 
104122
105- const  Scroller  =  styled . div ` 
123+ const  ScrollerTitle  =  styled . h2 ` 
124+   text-align: center; 
125+ ` ; 
126+ const  ScrollerSection  =  styled . section ` 
106127  overflow: auto; 
107128  /* flex: 1; */ 
108129  border: 1px solid ${ p  =>  p . theme . colors . bg2 }  ; 
109130  border-radius: ${ p  =>  p . theme . radius }  ; 
110-   margin: 1rem; 
111131  background-color: ${ p  =>  p . theme . colors . bg }  ; 
112132  padding: 1rem; 
113133  width: 20rem; 
0 commit comments