You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
67 lines
2.0 KiB
67 lines
2.0 KiB
import React, { useState, useEffect, createContext } from "react";
|
|
import type { FunctionComponent, PropsWithChildren } from "react";
|
|
import type { Container, LeafUri } from "@ldo/solid";
|
|
import { useSolidAuth, useLdo, useResource } from "@ldo/solid-react";
|
|
|
|
export const MainContainerContext = createContext<Container | undefined>(
|
|
undefined,
|
|
);
|
|
|
|
const MainContainerSubProvider: FunctionComponent<
|
|
PropsWithChildren<{ uri?: string }>
|
|
> = ({ uri, children }) => {
|
|
const mainContainer = useResource(uri);
|
|
return (
|
|
<MainContainerContext.Provider value={mainContainer as Container}>
|
|
{children}
|
|
</MainContainerContext.Provider>
|
|
);
|
|
};
|
|
|
|
export const MainContainerProvider: FunctionComponent<PropsWithChildren> = ({
|
|
children,
|
|
}) => {
|
|
const [mainContainer, setMainContainer] = useState<Container | undefined>();
|
|
const { session } = useSolidAuth();
|
|
const { getResource } = useLdo();
|
|
|
|
useEffect(() => {
|
|
if (session.webId) {
|
|
const webIdResource = getResource(session.webId as LeafUri);
|
|
webIdResource.getRootContainer().then(async (rootContainer) => {
|
|
if (rootContainer.isError) {
|
|
alert(rootContainer.message);
|
|
return;
|
|
}
|
|
const mainContainer = getResource(`${rootContainer.uri}demo-react/`);
|
|
setMainContainer(mainContainer);
|
|
const createResult = await mainContainer.createIfAbsent();
|
|
// Only set the access rules if the create was a success.
|
|
if (createResult.type === "createSuccess") {
|
|
await mainContainer.setAccessRules({
|
|
public: {
|
|
read: true,
|
|
write: false,
|
|
append: false,
|
|
control: false,
|
|
},
|
|
agent: {
|
|
[session.webId!]: {
|
|
read: true,
|
|
write: true,
|
|
append: true,
|
|
control: true,
|
|
},
|
|
},
|
|
});
|
|
}
|
|
});
|
|
}
|
|
}, [session.webId]);
|
|
|
|
return (
|
|
<MainContainerSubProvider uri={mainContainer?.uri}>
|
|
{children}
|
|
</MainContainerSubProvider>
|
|
);
|
|
};
|
|
|