@@ -19,13 +19,13 @@ import Header from "./Header";
1919import Sidebar from "./Sidebar" ;
2020import Breadcrumb from "./Breadcrumb" ;
2121import FileList from "./FileList" ;
22- import PermissionsDialog , { Permission } from "./PermissionsDialog" ;
2322import NewFolderDialog from "./NewFolderDialog" ;
2423import RenameDialog from "./RenameDialog" ;
2524import PreviewModal from "./PreviewModal" ;
2625import MoveDialog from "./MoveDialog" ;
2726import DeleteConfirmDialog from "./DeleteConfirmDialog" ;
2827import ShareDialog , { AccessLevel } from "./ShareDialog" ;
28+ import ShareSuccessModal from "./ShareSuccessModal" ;
2929import FileUploadHandler from "./FileUploadHandler" ;
3030import ContextMenu , { ContextMenuAction } from "./ContextMenu" ;
3131import { FileItemData } from "./FileItem" ;
@@ -48,6 +48,7 @@ import {
4848 hasFiles as hasFilesInDrag ,
4949 isUnsupportedFolderDrag ,
5050} from "../lib/helpers" ;
51+ import { shareResourceWithAcp } from "../lib/helpers/acpUtils" ;
5152import {
5253 getUrlFromSearchParams ,
5354 getUrlFromStorage ,
@@ -76,10 +77,6 @@ export default function FileManager() {
7677 const [ selectedFileIds , setSelectedFileIds ] = useState < string [ ] > ( [ ] ) ;
7778 const [ isInitialized , setIsInitialized ] = useState ( false ) ;
7879 const [ refreshKey , setRefreshKey ] = useState ( 0 ) ;
79- const [ permissionsDialogOpen , setPermissionsDialogOpen ] = useState ( false ) ;
80- const [ selectedFileForPermissions , setSelectedFileForPermissions ] =
81- useState < FileItemData | null > ( null ) ;
82- const [ permissions , setPermissions ] = useState < Permission [ ] > ( [ ] ) ;
8380 const [ sidebarOpen , setSidebarOpen ] = useState ( false ) ;
8481 const [ showNewFolderDialog , setShowNewFolderDialog ] = useState ( false ) ;
8582 const [ fileUploadTrigger , setFileUploadTrigger ] = useState ( 0 ) ;
@@ -99,6 +96,9 @@ export default function FileManager() {
9996 const [ showShareDialog , setShowShareDialog ] = useState ( false ) ;
10097 const [ fileToShare , setFileToShare ] = useState < FileItemData | null > ( null ) ;
10198 const [ contextMenuState , setContextMenuState ] = useState < ContextMenuState | null > ( null ) ;
99+ const [ showShareSuccessModal , setShowShareSuccessModal ] = useState ( false ) ;
100+ const [ sharedResourceUrl , setSharedResourceUrl ] = useState < string > ( "" ) ;
101+ const [ sharedResourceName , setSharedResourceName ] = useState < string > ( "" ) ;
102102
103103 const closeContextMenu = ( ) => setContextMenuState ( null ) ;
104104
@@ -401,10 +401,38 @@ export default function FileManager() {
401401 setShowShareDialog ( true ) ;
402402 } ;
403403
404- const handleShareConfirm = async ( webId : string , accessLevel : AccessLevel ) => {
405- // TODO: Implement actual sharing logic
406- console . log ( `Sharing ${ fileToShare ?. name } with ${ webId } as ${ accessLevel } ` ) ;
407- toast . success ( `Shared with ${ webId } as ${ accessLevel } ` ) ;
404+ const handleShareConfirm = async ( webIds : string [ ] , accessLevel : AccessLevel ) => {
405+ if ( ! fileToShare ) {
406+ return ;
407+ }
408+
409+ const toastId = toast . loading ( `Sharing "${ fileToShare . name } "...` ) ;
410+ try {
411+ // Get the resource URL - ensure it has a trailing slash for containers
412+ let resourceUrl = fileToShare . url ;
413+ if ( fileToShare . type === "folder" && ! resourceUrl . endsWith ( "/" ) ) {
414+ resourceUrl += "/" ;
415+ }
416+
417+ await shareResourceWithAcp ( resourceUrl , webIds , accessLevel ) ;
418+
419+ toast . success ( `Successfully shared "${ fileToShare . name } "` , { id : toastId } ) ;
420+ setShowShareDialog ( false ) ;
421+
422+ // Show success modal with resource URL
423+ setSharedResourceUrl ( resourceUrl ) ;
424+ setSharedResourceName ( fileToShare . name ) ;
425+ setShowShareSuccessModal ( true ) ;
426+ setFileToShare ( null ) ;
427+ } catch ( error ) {
428+ console . error ( "Failed to share resource:" , error ) ;
429+ toast . error (
430+ error instanceof Error
431+ ? `Failed to share: ${ error . message } `
432+ : "Failed to share resource" ,
433+ { id : toastId }
434+ ) ;
435+ }
408436 } ;
409437
410438 const handleDragEnter = ( event : React . DragEvent < HTMLElement > ) => {
@@ -711,41 +739,6 @@ export default function FileManager() {
711739 }
712740 } ;
713741
714- const handleShareClickForFile = ( file : FileItemData ) => {
715- setSelectedFileForPermissions ( file ) ;
716- setPermissionsDialogOpen ( true ) ;
717- setPermissions ( [
718- {
719- id : "1" ,
720- type : "user" ,
721- webId : "https://id.inrupt.com/user" ,
722- name : "You" ,
723- role : "owner" ,
724- } ,
725- ] ) ;
726- } ;
727-
728- const handleAddPermission = async ( webId : string , role : "viewer" | "editor" ) => {
729- const newPermission : Permission = {
730- id : Date . now ( ) . toString ( ) ,
731- type : "user" ,
732- webId,
733- name : webId . split ( "/" ) . pop ( ) || webId ,
734- role,
735- } ;
736- setPermissions ( ( prev ) => [ ...prev , newPermission ] ) ;
737- } ;
738-
739- const handleRemovePermission = ( permissionId : string ) => {
740- setPermissions ( ( prev ) => prev . filter ( ( p ) => p . id !== permissionId ) ) ;
741- } ;
742-
743- const handleUpdatePermission = ( permissionId : string , role : "viewer" | "editor" ) => {
744- setPermissions ( ( prev ) =>
745- prev . map ( ( p ) => ( p . id === permissionId ? { ...p , role } : p ) )
746- ) ;
747- } ;
748-
749742 if ( isLoadingStorages ) {
750743 return (
751744 < AuthWrapper >
@@ -831,7 +824,7 @@ export default function FileManager() {
831824 </ div >
832825 { isBrowsing ? (
833826 < div className = "flex flex-1 items-center justify-center" >
834- < LoadingSpinner size = "md" text = "Loading folder contents..." />
827+ < LoadingSpinner size = "md" text = "Loading folder contents..." />
835828 </ div >
836829 ) : (
837830 < div className = "flex-1 min-h-0 overflow-hidden" >
@@ -854,20 +847,7 @@ export default function FileManager() {
854847 ) }
855848 </ main >
856849 </ div >
857- { selectedFileForPermissions && (
858- < PermissionsDialog
859- isOpen = { permissionsDialogOpen }
860- onClose = { ( ) => {
861- setPermissionsDialogOpen ( false ) ;
862- setSelectedFileForPermissions ( null ) ;
863- } }
864- fileName = { selectedFileForPermissions . name }
865- permissions = { permissions }
866- onAddPermission = { handleAddPermission }
867- onRemovePermission = { handleRemovePermission }
868- onUpdatePermission = { handleUpdatePermission }
869- />
870- ) }
850+
871851 < NewFolderDialog
872852 isOpen = { showNewFolderDialog }
873853 onClose = { ( ) => setShowNewFolderDialog ( false ) }
@@ -921,6 +901,16 @@ export default function FileManager() {
921901 file = { fileToShare }
922902 onShare = { handleShareConfirm }
923903 />
904+ < ShareSuccessModal
905+ isOpen = { showShareSuccessModal }
906+ onClose = { ( ) => setShowShareSuccessModal ( false ) }
907+ resourceUrl = { sharedResourceUrl }
908+ resourceName = { sharedResourceName }
909+ onOpenInApp = { ( url ) => {
910+ // Navigate to the resource URL in the file manager
911+ updateUrl ( url ) ;
912+ } }
913+ />
924914 { isDragActive && (
925915 < div className = "pointer-events-none fixed inset-0 z-40 flex flex-col items-center justify-center bg-purple-500/10" >
926916 < div className = "rounded-2xl border border-purple-400 bg-white/90 px-8 py-6 text-center shadow-lg" >
0 commit comments