import { useCallback, useEffect, useState } from 'react';
import type { MouseEventHandler } from 'react';
import { Story, Meta } from '@storybook/react';
import { action } from '@storybook/addon-actions';
import PeopleAltOutlinedIcon from '@mui/icons-material/PeopleAltOutlined';
import Typography from '@mui/material/Typography';
import { ASSETS_URL } from '../../consts/common';
import type { MenuContentProps } from '../dropdown-menu';
import { RightSideBarProvider, RightSideBar, useRightSideBar } from '../right-sidebar';
import { Layout } from './index';
import { LayoutProps } from './types';
const sidebarItemsMap = {
dashboard: {
name: 'All Tenants',
Icon: PeopleAltOutlinedIcon,
items: [
{ name: 'All Tenants', path: '/marketing/collection-cohort' },
{ name: 'Networks', path: '/marketing/collection-cohort' },
{ name: 'Applications', path: '/marketing/collection-cohort' },
{ name: 'Cancellations', path: '/marketing/all-customers' }
]
},
cs: {
name: 'CS',
Icon: PeopleAltOutlinedIcon,
items: [
{ name: 'Satisfaction Board', path: '/marketing/collection-cohort' },
{ name: 'QBRs Board', path: '/marketing/collection-cohort' },
{
name: 'Agent Rollout',
subItems: [
{
name: 'Agent Rollout Logs',
path: '/cs/agent-rollout/rollout-versions'
}
]
}
]
},
product: {
name: 'Product',
Icon: PeopleAltOutlinedIcon,
items: [
{ name: 'Feature Adoption', path: '/marketing/collection-cohort' },
{
name: 'Feature Flag UI',
subItems: [
{
name: 'FF UI Logs',
path: '/cs/agent-rollout/rollout-versions'
}
]
}
]
},
arr: {
name: 'ARR',
Icon: PeopleAltOutlinedIcon,
items: [
{ name: 'ARR Activity', path: '/marketing/collection-cohort' },
{ name: 'ARR Cohort', path: '/marketing/collection-cohort' },
{ name: 'Churn Cohort', path: '/marketing/all-customers' }
]
},
marketing: {
name: 'Marketing',
Icon: PeopleAltOutlinedIcon,
items: [{ name: 'Collection Cohort', path: '/marketing/collection-cohort' }]
}
};
const mockClientsData = [
{
value: 'someid1',
name: 'ingrammicro',
content: {
src: `${ASSETS_URL}/icons/icon_msp.svg`,
title: 'Ingram Micro Inc',
subtitle: 'Partner'
},
default: true
},
{
value: 'someid2',
name: 'hpjewels',
content: {
src: 'https://www.google.com/s2/favicons?domain=https://www.hydeparkjewelers.com',
title: 'Hyde Park Jewelers',
subtitle: 'Client'
}
},
{
value: 'someid3',
name: 'tcgsolutions',
content: {
src: 'https://www.google.com/s2/favicons?domain=http://tcgsolutions.pro',
title: 'TCG Solutions',
subtitle: 'Client'
}
},
{
value: 'someid4',
name: 'rorona',
content: {
src: `${ASSETS_URL}/icons/icon_msp.svg`,
title: '121324324233231312 32423312321321321321312 32132131232132132213',
subtitle: 'Client'
}
}
];
const mockLayoutProps: LayoutProps = {
children: 'Hello World!',
// open and setOpen deleted in the Template
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
sidebarProps: {
logo: (
<>
Logo
>
),
closedLogo: ,
sidebarItemsMap,
mspClientPicker: {
isMSP: false,
props: {
createNewOrg: () => true,
onClientClick: action('client click') as MenuContentProps['handleClick'],
bottomBtnText: 'Add a New Organization',
orgList: mockClientsData,
selectValue: ''
}
}
},
headerProps: {
breadcrumbsProps: {
sidebarItemsMap,
pathname: '/cs/agent-rollout/rollout-logs'
},
userControlsProps: {
name: 'Mock User',
userRole: 'Developer',
avatarProps: {
src: 'https://upload.wikimedia.org/wikipedia/commons/8/8f/Cute-kittens-12929201-1600-1200.jpg'
},
notificationBadgeProps: {
badgeContent: 4
},
showDividers: true
}
},
initLeftState: 'closed',
disableSizeChanges: false,
hideHeader: false
};
export default {
component: Layout,
title: 'Layout/Layout Frame',
decorators: [
Story => (
)
],
parameters: {
layout: 'fullscreen'
},
argTypes: {
children: {
description: 'Content of the page.'
},
headerProps: {
description: 'Props which will be supplied to the header component.'
},
sidebarProps: {
description: 'Props which will be supplied to the navigation sidebar component.'
},
initLeftState: {
description: 'Initial state of the left sidebar, used for disabling state changes.',
options: ['closed', 'open', 'locked'],
control: {
type: 'select'
},
table: {
defaultValue: {
summary: 'closed'
}
}
},
disableSizeChanges: {
description: 'If true, then the sidebars wont change according to screen size.',
table: {
defaultValue: {
summary: false
}
}
},
hideHeader: {
description:
"If true, the client is running inside CP's infinity portal and header and logo will not be visible.",
table: {
defaultValue: {
summary: false
}
}
}
}
} as Meta;
const Template: Story = args => {
const {
displayDifComponent,
setDrawerBehavior,
setShowDrawer,
setComponentSecondaryDrawer,
setOpenSecondary,
addEventListener,
dispatchEvent
} = useRightSideBar();
const [listenerAttached, setListenerAttached] = useState(false);
useEffect(() => {
if (!listenerAttached) {
addEventListener('open', e => {
action('open')(e);
});
addEventListener('locked', e => {
action('locked')(e);
});
addEventListener('closed', e => {
action('closed')(e);
});
addEventListener('openSecondary', e => {
action('openSecondary')(e);
});
addEventListener('closedSecondary', e => {
action('closedSecondary')(e);
});
setListenerAttached(true);
}
}, [addEventListener, listenerAttached]);
useEffect(() => {
displayDifComponent(
<>
Main Drawer
Use displayDifComponent()
from useRightSideBar()
>
);
}, [displayDifComponent]);
useEffect(() => {
setShowDrawer(true);
setDrawerBehavior();
}, [setDrawerBehavior, setShowDrawer]);
const handleNotificationClick: MouseEventHandler | ((event?: Event) => void) =
useCallback(
(event?: Event) => {
dispatchEvent('openSecondary', event);
setComponentSecondaryDrawer(
<>
Secondary Drawer
Use setComponentSecondaryDrawer()
from useRightSideBar()
>
);
setOpenSecondary(true);
},
[setComponentSecondaryDrawer, setOpenSecondary, dispatchEvent]
);
if (args.headerProps.userControlsProps) {
args.headerProps.userControlsProps.handleNotificationClick = event =>
handleNotificationClick(event as unknown as Event);
}
return (
<>
>
);
};
export const Primary = Template.bind({});
Primary.args = mockLayoutProps;