Skip to content

Commit 6e2f0f2

Browse files
committed
WIP fix for referring local modal (see #53)
1 parent 44485be commit 6e2f0f2

File tree

5 files changed

+64
-29
lines changed

5 files changed

+64
-29
lines changed

demo-app/resources/js/Pages/Local.jsx

+11-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,14 @@
11
import { Modal, ModalLink } from '@inertiaui/modal-react';
22
import Container from './Container';
3+
import { useRef } from 'react';
34

45
export default function Local() {
6+
const modalRef = useRef(null);
7+
8+
function closeModal() {
9+
modalRef.current.close();
10+
}
11+
512
return (
613
<>
714
<Container>
@@ -15,11 +22,14 @@ export default function Local() {
1522
</ModalLink>
1623
</div>
1724
</Container>
18-
<Modal name="local">
25+
<Modal name="local" ref={modalRef}>
1926
This is a local modal
2027
<ModalLink href="/roles/create">
2128
Create Role
2229
</ModalLink>
30+
<button onClick={closeModal}>
31+
Close Modal through Ref
32+
</button>
2333
</Modal>
2434
</>
2535
);

demo-app/resources/js/Pages/Local.vue

+12-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,13 @@
11
<script setup>
22
import Container from './Container.vue'
33
import { Modal, ModalLink } from '@inertiaui/modal-vue'
4+
import { ref } from 'vue';
5+
6+
const modalRef = ref(null);
7+
8+
function closeModal() {
9+
modalRef.value.close();
10+
}
411
</script>
512

613
<template>
@@ -14,11 +21,15 @@ import { Modal, ModalLink } from '@inertiaui/modal-vue'
1421
</div>
1522
</Container>
1623

17-
<Modal name="local">
24+
<Modal name="local" ref="modalRef">
1825
This is a local modal
1926

2027
<ModalLink href="/roles/create">
2128
Create Role
2229
</ModalLink>
30+
31+
<button @click="closeModal">
32+
Close Modal through Ref
33+
</button>
2334
</Modal>
2435
</template>

demo-app/tests/Browser/LocalModalTest.php

+12
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,16 @@ public function it_can_open_a_local_modal_and_a_nested_one()
2020
->waitUntilMissingModal(1);
2121
});
2222
}
23+
24+
#[Test]
25+
public function it_can_close_a_local_modal_through_a_template_ref()
26+
{
27+
$this->browse(function (Browser $browser) {
28+
$browser->visit('/local')
29+
->clickLink('Open Local Modal')
30+
->waitForTextIn('.im-modal-content', 'This is a local modal')
31+
->press('Close Modal through Ref')
32+
->waitUntilMissingModal(1);
33+
});
34+
}
2335
}

react/src/HeadlessModal.jsx

+16-14
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ const HeadlessModal = forwardRef(({ name, children, ...props }, ref) => {
99
const { stack, registerLocalModal, removeLocalModal } = useModalStack()
1010

1111
const [localModalContext, setLocalModalContext] = useState(null)
12+
let modalContextCopy = name ? localModalContext : stack[modalIndex]
1213
const modalContext = useMemo(() => (name ? localModalContext : stack[modalIndex]), [name, localModalContext, modalIndex, stack])
1314

1415
const nextIndex = useMemo(() => {
@@ -38,6 +39,7 @@ const HeadlessModal = forwardRef(({ name, children, ...props }, ref) => {
3839
registerLocalModal(name, (localContext) => {
3940
removeListeners = localContext.registerEventListenersFromProps(props)
4041
setLocalModalContext(localContext)
42+
modalContextCopy = localContext
4143
})
4244

4345
return () => {
@@ -53,22 +55,22 @@ const HeadlessModal = forwardRef(({ name, children, ...props }, ref) => {
5355
useImperativeHandle(
5456
ref,
5557
() => ({
56-
afterLeave: () => modalContext.afterLeave(),
57-
close: () => modalContext.close(),
58+
afterLeave: () => modalContextCopy.afterLeave(),
59+
close: () => modalContextCopy.close(),
5860
config,
59-
emit: (...args) => modalContext.emit(...args),
60-
getChildModal: () => modalContext.getChildModal(),
61-
getParentModal: () => modalContext.getParentModal(),
62-
id: modalContext?.id,
63-
index: modalContext?.index,
64-
isOpen: modalContext?.isOpen,
65-
modalContext,
66-
onTopOfStack: modalContext?.onTopOfStack,
67-
reload: () => modalContext.reload(),
68-
setOpen: () => modalContext.setOpen(),
69-
shouldRender: modalContext?.shouldRender,
61+
emit: (...args) => modalContextCopy.emit(...args),
62+
getChildModal: () => modalContextCopy.getChildModal(),
63+
getParentModal: () => modalContextCopy.getParentModal(),
64+
id: modalContextCopy?.id,
65+
index: modalContextCopy?.index,
66+
isOpen: modalContextCopy?.isOpen,
67+
modalContext: modalContextCopy,
68+
onTopOfStack: modalContextCopy?.onTopOfStack,
69+
reload: () => modalContextCopy.reload(),
70+
setOpen: () => modalContextCopy.setOpen(),
71+
shouldRender: modalContextCopy?.shouldRender,
7072
}),
71-
[modalContext],
73+
[modalContextCopy],
7274
)
7375

7476
return (

vue/src/HeadlessModal.vue

+13-13
Original file line numberDiff line numberDiff line change
@@ -92,20 +92,20 @@ function emit(event, ...args) {
9292
}
9393
9494
defineExpose({
95-
afterLeave: modalContext.value.afterLeave,
96-
close: modalContext.value.close,
97-
config: config.value,
95+
afterLeave: () => modalContext.value?.afterLeave(),
96+
close: () => modalContext.value?.close(),
97+
config: computed(() => modalContext.value?.config),
9898
emit,
99-
getChildModal: modalContext.value.getChildModal,
100-
getParentModal: modalContext.value.getParentModal,
101-
id: modalContext.value.id,
102-
index: modalContext.value.index,
103-
isOpen: modalContext.value.isOpen,
104-
modalContext: modalContext.value,
105-
onTopOfStack: modalContext.value.onTopOfStack,
106-
reload: modalContext.value.reload,
107-
setOpen: modalContext.value.setOpen,
108-
shouldRender: modalContext.value.shouldRender,
99+
getChildModal: () => modalContext.value?.getChildModal(),
100+
getParentModal: () => modalContext.value?.getParentModal(),
101+
id: computed(() => modalContext.value?.id),
102+
index: computed(() => modalContext.value?.index),
103+
isOpen: computed(() => modalContext.value?.isOpen),
104+
modalContext: computed(() => modalContext.value?.modalContext),
105+
onTopOfStack: computed(() => modalContext.value?.onTopOfStack),
106+
reload: (...args) => modalContext.value?.reload(...args),
107+
setOpen: (...args) => modalContext.value?.setOpen(...args),
108+
shouldRender: computed(() => modalContext.value?.shouldRender),
109109
})
110110
111111
const nextIndex = computed(() => {

0 commit comments

Comments
 (0)