2018-11-30 17:18:41 +08:00
import React , { Component , Fragment } from 'react' ;
2019-03-19 10:35:21 +08:00
import cookie from 'react-cookies' ;
2024-07-09 15:08:47 +08:00
import { navigate } from '@gatsbyjs/reach-router' ;
import { DropdownToggle , Dropdown , DropdownMenu , DropdownItem } from 'reactstrap' ;
2018-11-30 17:18:41 +08:00
import { seafileAPI } from '../../utils/seafile-api' ;
2024-07-09 15:08:47 +08:00
import { gettext , siteRoot } from '../../utils/constants' ;
2018-12-28 15:19:10 +08:00
import { Utils } from '../../utils/utils' ;
2019-07-16 10:01:09 +08:00
import toaster from '../../components/toast' ;
2018-12-28 15:19:10 +08:00
import Repo from '../../models/repo' ;
2019-02-13 14:21:39 +08:00
import Loading from '../../components/loading' ;
2019-06-10 17:30:10 +08:00
import EmptyTip from '../../components/empty-tip' ;
2019-02-13 14:21:39 +08:00
import MylibRepoListView from './mylib-repo-list-view' ;
2019-07-16 07:55:55 +08:00
import SortOptionsDialog from '../../components/dialog/sort-options' ;
2024-07-09 15:08:47 +08:00
import SingleDropdownToolbar from '../../components/toolbar/single-dropdown-toolbar' ;
import ModalPortal from '../../components/modal-portal' ;
import CreateRepoDialog from '../../components/dialog/create-repo-dialog' ;
2018-11-30 17:18:41 +08:00
class MyLibraries extends Component {
constructor ( props ) {
super ( props ) ;
this . state = {
errorMsg : '' ,
2019-02-13 14:21:39 +08:00
isLoading : true ,
repoList : [ ] ,
2024-07-09 15:08:47 +08:00
isCreateRepoDialogOpen : false ,
isDropdownMenuOpen : false ,
2019-07-16 07:55:55 +08:00
isSortOptionsDialogOpen : false ,
2019-05-29 14:43:22 +08:00
sortBy : cookie . load ( 'seafile-repo-dir-sort-by' ) || 'name' , // 'name' or 'time' or 'size'
2019-04-12 14:30:08 +08:00
sortOrder : cookie . load ( 'seafile-repo-dir-sort-order' ) || 'asc' , // 'asc' or 'desc'
2018-11-30 17:18:41 +08:00
} ;
2019-02-13 14:21:39 +08:00
2020-01-03 16:50:17 +08:00
this . emptyTip = (
2019-06-10 17:30:10 +08:00
< EmptyTip >
2020-01-03 16:50:17 +08:00
< h2 > { gettext ( 'No libraries' ) } < / h 2 >
< p > { gettext ( 'You have not created any libraries yet. A library is a container to organize your files and folders. A library can also be shared with others and synced to your connected devices. You can create a library by clicking the "New Library" button in the menu bar.' ) } < / p >
2019-06-10 17:30:10 +08:00
< / E m p t y T i p >
2019-02-13 14:21:39 +08:00
) ;
2018-11-30 17:18:41 +08:00
}
componentDidMount ( ) {
2018-12-12 17:51:12 +08:00
seafileAPI . listRepos ( { type : 'mine' } ) . then ( ( res ) => {
2018-12-28 15:19:10 +08:00
let repoList = res . data . repos . map ( ( item ) => {
return new Repo ( item ) ;
} ) ;
2018-11-30 17:18:41 +08:00
this . setState ( {
2019-02-13 14:21:39 +08:00
isLoading : false ,
repoList : Utils . sortRepos ( repoList , this . state . sortBy , this . state . sortOrder )
2018-11-30 17:18:41 +08:00
} ) ;
} ) . catch ( ( error ) => {
2019-12-05 15:45:16 +08:00
this . setState ( {
isLoading : false ,
errorMsg : Utils . getErrorMsg ( error , true ) // true: show login tip if 403
} ) ;
2018-11-30 17:18:41 +08:00
} ) ;
}
2019-07-16 07:55:55 +08:00
toggleSortOptionsDialog = ( ) => {
this . setState ( {
isSortOptionsDialogOpen : ! this . state . isSortOptionsDialogOpen
} ) ;
2023-09-13 08:40:50 +08:00
} ;
2019-07-16 07:55:55 +08:00
2018-12-07 10:36:59 +08:00
onCreateRepo = ( repo ) => {
2024-07-09 15:08:47 +08:00
this . toggleCreateRepoDialog ( ) ;
2018-12-07 10:36:59 +08:00
seafileAPI . createMineRepo ( repo ) . then ( ( res ) => {
2019-08-08 13:08:13 +08:00
const newRepo = new Repo ( {
2018-12-17 15:12:10 +08:00
repo _id : res . data . repo _id ,
repo _name : res . data . repo _name ,
size : res . data . repo _size ,
mtime : res . data . mtime ,
owner _email : res . data . email ,
encrypted : res . data . encrypted ,
2019-08-08 13:08:13 +08:00
permission : res . data . permission ,
storage _name : res . data . storage _name
} ) ;
this . state . repoList . unshift ( newRepo ) ;
2019-02-13 14:21:39 +08:00
this . setState ( { repoList : this . state . repoList } ) ;
2019-07-16 10:01:09 +08:00
} ) . catch ( error => {
let errMessage = Utils . getErrorMsg ( error ) ;
toaster . danger ( errMessage ) ;
2018-12-07 10:36:59 +08:00
} ) ;
2023-09-13 08:40:50 +08:00
} ;
2018-12-07 10:36:59 +08:00
2019-02-13 14:21:39 +08:00
sortRepoList = ( sortBy , sortOrder ) => {
2019-04-12 14:30:08 +08:00
cookie . save ( 'seafile-repo-dir-sort-by' , sortBy ) ;
cookie . save ( 'seafile-repo-dir-sort-order' , sortOrder ) ;
2018-12-28 15:19:10 +08:00
this . setState ( {
sortBy : sortBy ,
sortOrder : sortOrder ,
2019-02-13 14:21:39 +08:00
repoList : Utils . sortRepos ( this . state . repoList , sortBy , sortOrder )
2018-12-28 15:19:10 +08:00
} ) ;
2023-09-13 08:40:50 +08:00
} ;
2018-12-28 15:19:10 +08:00
2018-12-12 15:34:54 +08:00
onTransferRepo = ( repoID ) => {
2019-02-13 14:21:39 +08:00
let repoList = this . state . repoList . filter ( item => {
2018-12-12 15:34:54 +08:00
return item . repo _id !== repoID ;
2019-01-31 17:37:02 +08:00
} ) ;
2019-02-13 14:21:39 +08:00
this . setState ( { repoList : repoList } ) ;
2023-09-13 08:40:50 +08:00
} ;
2018-12-07 02:46:47 +00:00
2018-12-12 15:34:54 +08:00
onRenameRepo = ( repo , newName ) => {
2019-02-13 14:21:39 +08:00
let repoList = this . state . repoList . map ( item => {
2018-12-12 15:34:54 +08:00
if ( item . repo _id === repo . repo _id ) {
item . repo _name = newName ;
2018-12-07 02:46:47 +00:00
}
2018-12-12 15:34:54 +08:00
return item ;
} ) ;
2019-02-13 14:21:39 +08:00
this . setState ( { repoList : repoList } ) ;
2023-09-13 08:40:50 +08:00
} ;
2020-11-02 13:56:35 +08:00
2023-02-03 09:51:18 +08:00
onMonitorRepo = ( repo , monitored ) => {
let repoList = this . state . repoList . map ( item => {
if ( item . repo _id === repo . repo _id ) {
item . monitored = monitored ;
}
return item ;
} ) ;
this . setState ( { repoList : repoList } ) ;
2023-09-13 08:40:50 +08:00
} ;
2023-02-03 09:51:18 +08:00
2018-12-12 15:34:54 +08:00
onDeleteRepo = ( repo ) => {
2019-02-13 14:21:39 +08:00
let repoList = this . state . repoList . filter ( item => {
2018-12-12 15:34:54 +08:00
return item . repo _id !== repo . repo _id ;
} ) ;
2019-02-13 14:21:39 +08:00
this . setState ( { repoList : repoList } ) ;
2023-09-13 08:40:50 +08:00
} ;
2018-12-12 15:34:54 +08:00
2024-07-09 15:08:47 +08:00
toggleCreateRepoDialog = ( ) => {
this . setState ( { isCreateRepoDialogOpen : ! this . state . isCreateRepoDialogOpen } ) ;
} ;
toggleDropdownMenu = ( ) => {
this . setState ( {
isDropdownMenuOpen : ! this . state . isDropdownMenuOpen
} ) ;
} ;
visitDeleted = ( ) => {
navigate ( ` ${ siteRoot } my-libs/deleted/ ` ) ;
} ;
visitDeletedviaKey = ( e ) => {
if ( e . key == 'Enter' || e . key == 'Space' ) {
this . visiteDeleted ( ) ;
}
} ;
2018-11-30 17:18:41 +08:00
render ( ) {
2024-07-09 15:08:47 +08:00
const { isDropdownMenuOpen } = this . state ;
2018-11-30 17:18:41 +08:00
return (
< Fragment >
2018-12-12 15:34:54 +08:00
< div className = "main-panel-center flex-row" >
2018-11-30 17:18:41 +08:00
< div className = "cur-view-container" >
2019-08-29 15:28:54 +08:00
< div className = "cur-view-path" >
2024-07-09 15:08:47 +08:00
< h3 className = "sf-heading m-0" >
{ gettext ( 'My Libraries' ) }
< SingleDropdownToolbar
opList = { [ { 'text' : gettext ( 'New Library' ) , 'onClick' : this . toggleCreateRepoDialog } ] }
/ >
< / h 3 >
< div >
{ ( ! Utils . isDesktop ( ) && this . state . repoList . length > 0 ) && < span className = "sf3-font sf3-font-sort action-icon" onClick = { this . toggleSortOptionsDialog } > < / s p a n > }
< Dropdown isOpen = { isDropdownMenuOpen } toggle = { this . toggleDropdownMenu } >
< DropdownToggle
tag = "i"
className = { 'cur-view-path-btn sf3-font-more sf3-font ml-2' }
data - toggle = "dropdown"
title = { gettext ( 'More operations' ) }
aria - label = { gettext ( 'More operations' ) }
aria - expanded = { isDropdownMenuOpen }
>
< / D r o p d o w n T o g g l e >
< DropdownMenu right = { true } >
< DropdownItem onClick = { this . visitDeleted } onKeyDown = { this . visitDeletedviaKey } > { gettext ( 'Deleted Libraries' ) } < / D r o p d o w n I t e m >
< / D r o p d o w n M e n u >
< / D r o p d o w n >
< / d i v >
2018-11-30 17:18:41 +08:00
< / d i v >
< div className = "cur-view-content" >
2019-02-13 14:21:39 +08:00
{ this . state . isLoading && < Loading / > }
2019-06-11 11:07:24 +08:00
{ ! this . state . isLoading && this . state . errorMsg && < p className = "error text-center mt-8" > { this . state . errorMsg } < / p > }
2020-01-03 16:50:17 +08:00
{ ! this . state . isLoading && ! this . state . errorMsg && this . state . repoList . length === 0 && this . emptyTip }
2019-06-11 11:07:24 +08:00
{ ! this . state . isLoading && ! this . state . errorMsg && this . state . repoList . length > 0 &&
2019-02-13 14:21:39 +08:00
< MylibRepoListView
sortBy = { this . state . sortBy }
sortOrder = { this . state . sortOrder }
repoList = { this . state . repoList }
onRenameRepo = { this . onRenameRepo }
onDeleteRepo = { this . onDeleteRepo }
onTransferRepo = { this . onTransferRepo }
2023-02-03 09:51:18 +08:00
onMonitorRepo = { this . onMonitorRepo }
2019-02-13 14:21:39 +08:00
sortRepoList = { this . sortRepoList }
/ >
}
2018-11-30 17:18:41 +08:00
< / d i v >
< / d i v >
2019-07-16 07:55:55 +08:00
{ this . state . isSortOptionsDialogOpen &&
< SortOptionsDialog
toggleDialog = { this . toggleSortOptionsDialog }
sortBy = { this . state . sortBy }
sortOrder = { this . state . sortOrder }
2019-07-17 17:37:39 +08:00
sortItems = { this . sortRepoList }
2019-07-16 07:55:55 +08:00
/ >
}
2024-07-09 15:08:47 +08:00
{ this . state . isCreateRepoDialogOpen && (
< ModalPortal >
< CreateRepoDialog
libraryType = 'mine'
onCreateRepo = { this . onCreateRepo }
onCreateToggle = { this . toggleCreateRepoDialog }
/ >
< / M o d a l P o r t a l >
) }
2018-11-30 17:18:41 +08:00
< / d i v >
< / F r a g m e n t >
) ;
}
}
export default MyLibraries ;