(props: SessionReviewProps)
| 23 | } |
| 24 | |
| 25 | export const SessionReview = (props: SessionReviewProps) => { |
| 26 | const diffComponent = useDiffComponent() |
| 27 | const [store, setStore] = createStore({ |
| 28 | open: props.diffs.map((d) => d.file), |
| 29 | }) |
| 30 | |
| 31 | const handleChange = (open: string[]) => { |
| 32 | setStore("open", open) |
| 33 | } |
| 34 | |
| 35 | const handleExpandOrCollapseAll = () => { |
| 36 | if (store.open.length > 0) { |
| 37 | setStore("open", []) |
| 38 | } else { |
| 39 | setStore( |
| 40 | "open", |
| 41 | props.diffs.map((d) => d.file), |
| 42 | ) |
| 43 | } |
| 44 | } |
| 45 | |
| 46 | return ( |
| 47 | <div |
| 48 | data-component="session-review" |
| 49 | classList={{ |
| 50 | ...(props.classList ?? {}), |
| 51 | [props.classes?.root ?? ""]: !!props.classes?.root, |
| 52 | [props.class ?? ""]: !!props.class, |
| 53 | }} |
| 54 | > |
| 55 | <div |
| 56 | data-slot="session-review-header" |
| 57 | classList={{ |
| 58 | [props.classes?.header ?? ""]: !!props.classes?.header, |
| 59 | }} |
| 60 | > |
| 61 | <div data-slot="session-review-title">Session changes</div> |
| 62 | <div data-slot="session-review-actions"> |
| 63 | <Button size="normal" icon="chevron-grabber-vertical" onClick={handleExpandOrCollapseAll}> |
| 64 | <Switch> |
| 65 | <Match when={store.open.length > 0}>Collapse all</Match> |
| 66 | <Match when={true}>Expand all</Match> |
| 67 | </Switch> |
| 68 | </Button> |
| 69 | {props.actions} |
| 70 | </div> |
| 71 | </div> |
| 72 | <div |
| 73 | data-slot="session-review-container" |
| 74 | classList={{ |
| 75 | [props.classes?.container ?? ""]: !!props.classes?.container, |
| 76 | }} |
| 77 | > |
| 78 | <Accordion multiple value={store.open} onChange={handleChange}> |
| 79 | <For each={props.diffs}> |
| 80 | {(diff) => ( |
| 81 | <Accordion.Item forceMount value={diff.file} data-slot="session-review-accordion-item"> |
| 82 | <StickyAccordionHeader> |
nothing calls this directly
no test coverage detected