saleor-dashboard/src/components/AppLayout/AppChannelContext.tsx
Jakub Majorek 18f09812a8
Saleor 2067 - Guard against non-staff users logging in (#947)
* Guard against non-staff users logging in

* Scope channel permissions

* Update changelog

* Update tests
2021-01-18 12:19:04 +01:00

78 lines
2.2 KiB
TypeScript

import { useAuth } from "@saleor/auth/AuthProvider";
import { useChannelsList } from "@saleor/channels/queries";
import { ChannelDetailsFragment } from "@saleor/fragments/types/ChannelDetailsFragment";
import useLocalStorage from "@saleor/hooks/useLocalStorage";
import React from "react";
interface UseAppChannel {
availableChannels: ChannelDetailsFragment[];
channel: ChannelDetailsFragment;
isPickerActive: boolean;
refreshChannels: () => void;
setChannel: (id: string) => void;
}
export interface AppChannelContextData extends UseAppChannel {
setPickerActive: (isActive: boolean) => void;
}
const AppChannelContext = React.createContext<AppChannelContextData>({
availableChannels: [],
channel: undefined,
isPickerActive: false,
refreshChannels: () => undefined,
setChannel: () => undefined,
setPickerActive: () => undefined
});
export const AppChannelProvider: React.FC = ({ children }) => {
const { isAuthenticated } = useAuth();
const [selectedChannel, setSelectedChannel] = useLocalStorage("channel", "");
const { data: channelData, refetch } = useChannelsList({
skip: !isAuthenticated
});
const [isPickerActive, setPickerActive] = React.useState(false);
React.useEffect(() => {
if (!selectedChannel && channelData?.channels) {
setSelectedChannel(channelData.channels[0].id);
}
}, [channelData]);
const availableChannels = channelData?.channels || [];
const channel =
channelData &&
(availableChannels.find(channel => channel.id === selectedChannel) || null);
return (
<AppChannelContext.Provider
value={{
availableChannels,
channel,
isPickerActive,
refreshChannels: refetch,
setChannel: setSelectedChannel,
setPickerActive
}}
>
{children}
</AppChannelContext.Provider>
);
};
AppChannelProvider.displayName = "AppChannelProvider";
function useAppChannel(enablePicker = true): UseAppChannel {
const { setPickerActive, ...data } = React.useContext(AppChannelContext);
React.useEffect(() => {
if (enablePicker) {
setPickerActive(true);
}
return () => setPickerActive(false);
}, [enablePicker]);
return data;
}
export default useAppChannel;