Skip to content

Commit 680ffb1

Browse files
committed
Change how args are passed from Django->Astro
1 parent a20aa1e commit 680ffb1

File tree

14 files changed

+109
-52
lines changed

14 files changed

+109
-52
lines changed

backend/custom_admin/src/components/invitation-letter-document-builder/local-state.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { useInvitationLetterDocumentSuspenseQuery } from "./invitation-letter-do
44
import { useUpdateInvitationLetterDocumentMutation } from "./update-invitation-letter-document.generated";
55

66
import { createContext } from "react";
7-
import { getArg } from "../shared/get-arg";
7+
import { useArgs } from "../shared/args";
88

99
type State = {
1010
header: string;
@@ -173,7 +173,7 @@ const removeTypenames = (obj) => {
173173
};
174174

175175
const useLoadRemoteData = (dispatch) => {
176-
const documentId = getArg("document_id");
176+
const { documentId } = useArgs();
177177

178178
const { data } = useInvitationLetterDocumentSuspenseQuery({
179179
variables: {
@@ -199,13 +199,14 @@ const useLoadRemoteData = (dispatch) => {
199199
const useSaveRemoteData = (): [(newData) => void, boolean, boolean] => {
200200
const [updateInvitationLetter, { loading: savingChanges, error }] =
201201
useUpdateInvitationLetterDocumentMutation();
202+
const { documentId } = useArgs();
202203

203204
return [
204205
(newData) => {
205206
updateInvitationLetter({
206207
variables: {
207208
input: {
208-
id: getArg("document_id"),
209+
id: documentId,
209210
dynamicDocument: newData,
210211
},
211212
},

backend/custom_admin/src/components/invitation-letter-document-builder/root.tsx

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,17 @@ import { DjangoAdminLayout } from "../shared/django-admin-layout";
55
import { InvitationLetterBuilder } from "./builder";
66
import { LocalStateProvider } from "./local-state";
77

8-
export const InvitationLetterDocumentBuilderRoot = () => {
8+
export const InvitationLetterDocumentBuilderRoot = ({
9+
documentId,
10+
breadcrumbs,
11+
}) => {
912
return (
10-
<Base>
13+
<Base
14+
args={{
15+
documentId,
16+
breadcrumbs,
17+
}}
18+
>
1119
<DjangoAdminLayout>
1220
<Suspense
1321
fallback={

backend/custom_admin/src/components/schedule-builder/root.tsx

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,19 @@ import { Calendar } from "./calendar";
66
import { PendingItemsBasket } from "./pending-items-basket";
77
import { useConferenceScheduleQuery } from "./schedule.generated";
88

9-
export const ScheduleBuilderRoot = () => {
9+
export const ScheduleBuilderRoot = ({
10+
conferenceId,
11+
conferenceCode,
12+
breadcrumbs,
13+
}) => {
1014
return (
11-
<Base>
15+
<Base
16+
args={{
17+
conferenceId,
18+
conferenceCode,
19+
breadcrumbs,
20+
}}
21+
>
1222
<AddItemModalProvider>
1323
<ScheduleBuilder />
1424
</AddItemModalProvider>
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import { createContext, useContext, useMemo } from "react";
2+
3+
const ArgsContext = createContext<Record<string, any>>({});
4+
5+
export const useArgs = () => {
6+
return useContext(ArgsContext);
7+
};
8+
9+
export const ArgsProvider = ({ children, args }) => {
10+
const resolvedArgs = useMemo(() => {
11+
return Object.entries(args).reduce((acc, [key, value]) => {
12+
try {
13+
acc[key] = JSON.parse(value as string);
14+
} catch (e) {
15+
acc[key] = value;
16+
}
17+
return acc;
18+
}, {});
19+
}, [args]);
20+
21+
return (
22+
<ArgsContext.Provider value={resolvedArgs}>{children}</ArgsContext.Provider>
23+
);
24+
};

backend/custom_admin/src/components/shared/base.tsx

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,30 +5,34 @@ import { HTML5Backend } from "react-dnd-html5-backend";
55

66
import "../shared/styles.css";
77
import clsx from "clsx";
8+
import { ArgsProvider } from "./args";
89
import { DjangoAdminEditorProvider } from "./django-admin-editor-modal";
910

1011
type Props = {
1112
children: React.ReactNode;
1213
widget?: boolean;
14+
args?: Record<string, any>;
1315
};
1416

1517
const client = new ApolloClient({
1618
uri: "/admin/graphql",
1719
cache: new InMemoryCache(),
1820
});
1921

20-
export const Base = ({ children, widget = false }: Props) => {
22+
export const Base = ({ children, args = {}, widget = false }: Props) => {
2123
return (
2224
<Theme
2325
className={clsx({
2426
"is-widget-theme": widget,
2527
})}
2628
>
27-
<ApolloProvider client={client}>
28-
<DjangoAdminEditorProvider>
29-
<DndProvider backend={HTML5Backend}>{children}</DndProvider>
30-
</DjangoAdminEditorProvider>
31-
</ApolloProvider>
29+
<ArgsProvider args={args}>
30+
<ApolloProvider client={client}>
31+
<DjangoAdminEditorProvider>
32+
<DndProvider backend={HTML5Backend}>{children}</DndProvider>
33+
</DjangoAdminEditorProvider>
34+
</ApolloProvider>
35+
</ArgsProvider>
3236
</Theme>
3337
);
3438
};

backend/custom_admin/src/components/shared/django-admin-layout.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import clsx from "clsx";
2-
import { getArg } from "./get-arg";
2+
import { useArgs } from "./args";
33

44
type Breadcrumb = {
55
title: string;
@@ -11,7 +11,8 @@ type Props = {
1111
};
1212

1313
export const DjangoAdminLayout = ({ children }: Props) => {
14-
const breadcrumbs: Breadcrumb[] = getArg("breadcrumbs");
14+
const { breadcrumbs } = useArgs();
15+
console.log("breadcrumbs", breadcrumbs);
1516
return (
1617
<div>
1718
<Header />

backend/custom_admin/src/components/shared/get-arg.ts

Lines changed: 0 additions & 10 deletions
This file was deleted.
Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1-
import { getArg } from "../shared/get-arg";
1+
import { useArgs } from "../shared/args";
22

33
export const useCurrentConference = (): {
44
conferenceCode: string;
55
conferenceId: string;
66
} => {
7+
const { conferenceId, conferenceCode } = useArgs();
78
return {
8-
conferenceId: getArg("conference_id"),
9-
conferenceCode: getArg("conference_code"),
9+
conferenceId,
10+
conferenceCode,
1011
};
1112
};
Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
1+
import { useState } from "react";
12
import { RichEditor } from "../../components/shared/rich-editor";
23
import { Base } from "../shared/base";
34

4-
export const RichEditorWidget = () => {
5+
export const RichEditorWidget = ({ name, value }) => {
6+
const [updatedValue, setUpdatedValue] = useState(value);
7+
58
return (
69
<Base widget>
7-
<div>
8-
<RichEditor
9-
content="<p>Initial content</p>"
10-
onUpdate={(content) => console.log(content)}
11-
/>
12-
</div>
10+
<RichEditor
11+
content={value}
12+
onUpdate={(content) => setUpdatedValue(content)}
13+
/>
14+
15+
<input type="hidden" name={name} value={updatedValue} />
1316
</Base>
1417
);
1518
};

backend/custom_admin/src/pages/invitation-letter-document-builder.astro

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,9 @@ import { InvitationLetterDocumentBuilderRoot } from "../components/invitation-le
99
</head>
1010

1111
<body class="text-sm">
12-
<InvitationLetterDocumentBuilderRoot client:only />
13-
14-
<Fragment set:html={`
15-
{{ document_id|json_script:"arg-document_id" }}
16-
{{ breadcrumbs|json_script:"arg-breadcrumbs" }}
17-
`} />
18-
12+
<InvitationLetterDocumentBuilderRoot
13+
documentId="{{ document_id }}"
14+
breadcrumbs="{{ breadcrumbs | to_json_for_prop }}"
15+
client:only />
1916
</body>
2017
</html>

0 commit comments

Comments
 (0)