import React, { createContext, FunctionComponent, PropsWithChildren, useCallback, useContext, useEffect, useMemo, useState, } from 'react'; import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle, } from '../ui/dialog'; import { Button } from '../ui/button'; import { Text } from '../ui/text'; import { CopyLink } from './CopyLink'; import { GetWacRuleError, GetWacRuleSuccess, SolidContainer, SolidLeaf, WacRule, } from '@ldo/connected-solid'; import { useViewContext } from '../useViewContext'; import { LoadingBar } from '../common/LoadingBar'; import { ScrollView } from 'react-native'; import { WacRuleForm } from './WacRuleForm'; import { isEqual } from 'lodash'; interface SharingModalMethods { openSharingModal: () => void; closeSharingModal: () => void; isModalOpen: boolean; } const sharingModalContext = createContext({ openSharingModal: () => {}, closeSharingModal: () => {}, isModalOpen: false, }); export const useSharingModal = () => { return useContext(sharingModalContext); }; export const SharingModalProvider: FunctionComponent> = ({ children, }) => { const { targetResource } = useViewContext(); const [isOpen, setIsOpen] = useState(false); const [wacResult, setWacResult] = useState< | GetWacRuleError | GetWacRuleSuccess | undefined >(); const [isLoading, setIsLoading] = useState(false); const [editedRules, setEditedRules] = useState({ public: { read: false, write: false, append: false, control: false }, authenticated: { read: false, write: false, append: false, control: false }, agent: {}, }); useEffect(() => { if ( targetResource && targetResource.type !== 'InvalidIdentifierResource' && isOpen ) { setIsLoading(true); targetResource.getWac().then((wac) => { setWacResult( wac as | GetWacRuleError | GetWacRuleSuccess, ); if (wac.type === 'getWacRuleSuccess') { setEditedRules(wac.wacRule); } setIsLoading(false); }); } }, [targetResource, isOpen]); const didEdit = useMemo(() => { if (wacResult?.type !== 'getWacRuleSuccess') return false; return !isEqual(editedRules, wacResult.wacRule); }, [editedRules, wacResult]); const context = useMemo( () => ({ isModalOpen: isOpen, openSharingModal: () => setIsOpen(true), closeSharingModal: () => setIsOpen(false), }), [isOpen], ); const onApplyChanges = useCallback(async () => { if ( didEdit && (targetResource?.type === 'SolidContainer' || targetResource?.type === 'SolidLeaf') ) { setIsLoading(true); const result = await targetResource.setWac(editedRules); // TODO throw error with toast setIsLoading(false); } setIsOpen(false); }, [editedRules, targetResource, didEdit]); return ( setIsOpen(value)}> Resource Sharing Preferences {(() => { if (!wacResult) return <>; if (wacResult.isError) { return ( {wacResult.message} ); } return ( ); })()} {children} ); };