Files
UT-Registration-Plus/src/stories/components/Dropdown.stories.tsx
Preston Cook 4752f5860a fix(ui): fix longstanding drag-and-drop duplication issue (#502)
* fix(ui): fixed color switching on list reordering

* chore: remove lock file

* chore: add back lock file

* feat(ui): fix color duplication issue and prevent scrolling beyond parent

* feat(ui): add to storybook

* fix(ui): remove white background while dragging

* chore: remove dnd pangea from package.json

* chore: rebuild lock file

* chore: remove nested li element issue

* fix(ui): allow grabbing cursor while dragging

* fix(ui): address chromatic errors

* fix(ui): address chromatic errors

* fix(ui): address linting issues and pass tests

* fix(ui): create hook for modifying the cursor globally

* chore: add check for storybook env

* chore: add back unused import to AddAllButton

* fix: make cursor grabbing hook more explicit

* chore: move sortable list item into sortable list file

* fix: remove isStorybook prop from ScheduleListItem

---------

Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>
2025-02-04 17:28:54 -06:00

93 lines
3.0 KiB
TypeScript

import { UserScheduleStore } from '@shared/storage/UserScheduleStore';
import { UserSchedule } from '@shared/types/UserSchedule';
import { generateRandomId } from '@shared/util/random';
import type { Meta, StoryObj } from '@storybook/react';
import type { ScheduleDropdownProps } from '@views/components/common/ScheduleDropdown';
import ScheduleDropdown from '@views/components/common/ScheduleDropdown';
import ScheduleListItem from '@views/components/common/ScheduleListItem';
import { SortableList } from '@views/components/common/SortableList';
import useSchedules, { getActiveSchedule, switchSchedule } from '@views/hooks/useSchedules';
import type { Serialized } from 'chrome-extension-toolkit';
import React, { useEffect } from 'react';
import { exampleSchedule } from '../injected/mocked';
const schedules: UserSchedule[] = new Array(10).fill(exampleSchedule).map(
(schedule: UserSchedule, index) =>
new UserSchedule({
...schedule,
id: generateRandomId(),
name: `Schedule ${index + 1}`,
})
);
UserScheduleStore.set(
'schedules',
schedules.reduce((acc, schedule) => {
acc.push(schedule);
return acc;
}, [] as Serialized<UserSchedule>[])
);
UserScheduleStore.set('activeIndex', 0);
const meta: Meta<typeof ScheduleDropdown> = {
title: 'Components/Common/Dropdown',
component: ScheduleDropdown,
parameters: {
layout: 'centered',
},
tags: ['autodocs'],
render: (args: ScheduleDropdownProps) => {
const [activeSchedule, schedules] = useSchedules();
useEffect(() => {
console.log(activeSchedule);
}, [activeSchedule]);
return (
<div className='w-80'>
<ScheduleDropdown {...args}>
<SortableList
className='gap-spacing-3'
draggables={schedules}
onChange={reordered => {
const activeSchedule = getActiveSchedule();
const activeIndex = reordered.findIndex(s => s.id === activeSchedule.id);
// don't care about the promise
UserScheduleStore.set('schedules', reordered);
UserScheduleStore.set('activeIndex', activeIndex);
}}
renderItem={schedule => (
<ScheduleListItem schedule={schedule} onClick={() => switchSchedule(schedule.id)} />
)}
/>
</ScheduleDropdown>
</div>
);
},
} satisfies Meta<typeof ScheduleDropdown>;
export default meta;
type Story = StoryObj<typeof meta>;
export const Hidden: Story = {
parameters: {
design: {
type: 'figma',
url: 'https://www.figma.com/file/8tsCay2FRqctrdcZ3r9Ahw/UTRP?type=design&node-id=1579-5083&mode=dev',
},
},
args: {
defaultOpen: false,
},
};
export const Visible: Story = {
args: {
defaultOpen: true,
},
};