Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions apps/pyconkr-admin/src/components/elements/error_fallback.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { Components } from "@frontend/common";
import { useCommonContext } from "@frontend/common/src/hooks/useCommonContext";
import * as React from "react";

export const ErrorFallback: React.FC<{ error: Error; reset: () => void }> = ({ error, reset }) => {
const { debug } = useCommonContext();
return <Components.ErrorFallback error={error} reset={reset} debug={debug} />;
};
11 changes: 7 additions & 4 deletions apps/pyconkr-admin/src/components/layouts/admin_editor.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import {
useSchemaQuery,
useUpdateMutation,
} from "@frontend/common/src/hooks/useAdminAPI";
import { useCommonContext } from "@frontend/common/src/hooks/useCommonContext";
import {
filterPropertiesByLanguageInJsonSchema,
filterReadOnlyPropertiesInJsonSchema,
Expand Down Expand Up @@ -50,6 +51,7 @@ import * as R from "remeda";

import { addErrorSnackbar, addSnackbar } from "../../utils/snackbar";
import { BackendAdminSignInGuard } from "../elements/admin_signin_guard";
import { ErrorFallback } from "../elements/error_fallback";

type EditorFormDataEventType = IChangeEvent<Record<string, string>, RJSFSchema, { [k in string]: unknown }>;
type onSubmitType = (data: Record<string, string>, event: React.FormEvent<unknown>) => void;
Expand Down Expand Up @@ -146,7 +148,7 @@ const fieldPropsToSelectedProps = (props: FieldProps): OutlinedSelectProps & { d
};

const M2MSelect: Field = ErrorBoundary.with(
{ fallback: Components.ErrorFallback },
{ fallback: ErrorFallback },
Suspense.with({ fallback: <CircularProgress /> }, (props) => {
const selectable = (props.schema.items as JSONSchema7).oneOf as DescriptedEnum[];
const selectableListObj: DescriptedEnumObject = selectable.reduce((a, i) => ({ ...a, [i.const]: i }), {} as DescriptedEnumObject);
Expand Down Expand Up @@ -181,7 +183,8 @@ const MDRendererContainer = styled(Box)(({ theme }) => ({
},
}));

const MDEditorField: Field = ErrorBoundary.with({ fallback: Components.ErrorFallback }, ({ disabled, formData, name, onChange: rawOnChange }) => {
const MDEditorField: Field = ErrorBoundary.with({ fallback: ErrorFallback }, ({ disabled, formData, name, onChange: rawOnChange }) => {
const { baseUrl, mdxComponents } = useCommonContext();
const [valueState, setValueState] = React.useState<string | undefined>(formData?.toString() || "");
const onChange = (value?: string) => {
setValueState(value);
Expand All @@ -195,7 +198,7 @@ const MDEditorField: Field = ErrorBoundary.with({ fallback: Components.ErrorFall
<Components.MarkdownEditor disabled={disabled} name={name} value={valueState} onChange={onChange} extraCommands={[]} />
</Box>
<MDRendererContainer>
<Components.MDXRenderer text={valueState || ""} format="md" />
<Components.MDXRenderer text={valueState || ""} format="md" baseUrl={baseUrl} mdxComponents={mdxComponents} />
</MDRendererContainer>
</Stack>
</MUIStyledFieldset>
Expand Down Expand Up @@ -262,7 +265,7 @@ type InnerAdminEditorStateType = {
};

const InnerAdminEditor: React.FC<AppResourceIdType & AdminEditorPropsType> = ErrorBoundary.with(
{ fallback: Components.ErrorFallback },
{ fallback: ErrorFallback },
Suspense.with(
{ fallback: <CircularProgress /> },
({
Expand Down
4 changes: 2 additions & 2 deletions apps/pyconkr-admin/src/components/layouts/admin_list.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import { Components } from "@frontend/common";
import { useBackendAdminClient, useChoicesQuery, useListQuery, useOpenApiSchemaQuery } from "@frontend/common/src/hooks/useAdminAPI";
import { extractQueryParameters } from "@frontend/common/src/utils";
import { Add } from "@mui/icons-material";
Expand All @@ -9,6 +8,7 @@ import { Link, useNavigate, useSearchParams } from "react-router-dom";

import { AdminListFilter } from "../elements/admin_list_filter";
import { BackendAdminSignInGuard } from "../elements/admin_signin_guard";
import { ErrorFallback } from "../elements/error_fallback";

type AdminListProps = {
app: string;
Expand All @@ -26,7 +26,7 @@ type ListRowType = {
};

const InnerAdminList: React.FC<AdminListProps> = ErrorBoundary.with(
{ fallback: Components.ErrorFallback },
{ fallback: ErrorFallback },
Suspense.with({ fallback: <CircularProgress /> }, ({ app, resource, hideCreatedAt, hideUpdatedAt, hideCreateNew }) => {
const navigate = useNavigate();

Expand Down
5 changes: 3 additions & 2 deletions apps/pyconkr-admin/src/components/pages/account/account.tsx
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
import { Components } from "@frontend/common";
import { useBackendAdminClient, useSignedInUserQuery } from "@frontend/common/src/hooks/useAdminAPI";
import { CircularProgress } from "@mui/material";
import { ErrorBoundary, Suspense } from "@suspensive/react";
import * as React from "react";
import { Navigate } from "react-router-dom";

import { ErrorFallback } from "../../elements/error_fallback";

export const AccountRedirectPage: React.FC = ErrorBoundary.with(
{ fallback: Components.ErrorFallback },
{ fallback: ErrorFallback },
Suspense.with({ fallback: <CircularProgress /> }, () => {
const backendAdminAPIClient = useBackendAdminClient();
const { data } = useSignedInUserQuery(backendAdminAPIClient);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { Components } from "@frontend/common";
import { useBackendAdminClient, usePublicFileQuery } from "@frontend/common/src/hooks/useAdminAPI";
import { useCommonContext } from "@frontend/common/src/hooks/useCommonContext";
import {
Accordion,
AccordionDetails,
Expand Down Expand Up @@ -78,10 +79,11 @@ export const PreviewTextField: React.FC<PreviewFieldProps> = ({ originalDataset,
};

export const PreviewMarkdownField: React.FC<SharedPreviewFieldProps> = ({ originalDataset, previewDataset, name, label }) => {
const { baseUrl, mdxComponents } = useCommonContext();
return originalDataset[name] === previewDataset[name] ? (
<Components.Fieldset legend={label} style={{ width: "100%" }}>
<MarkdownContainerBox>
<Components.MDXRenderer format="md" text={(previewDataset[name] as string) || "(값 없음)"} />
<Components.MDXRenderer format="md" text={(previewDataset[name] as string) || "(값 없음)"} baseUrl={baseUrl} mdxComponents={mdxComponents} />
</MarkdownContainerBox>
</Components.Fieldset>
) : (
Expand All @@ -91,7 +93,12 @@ export const PreviewMarkdownField: React.FC<SharedPreviewFieldProps> = ({ origin
<Stack sx={{ width: "100%" }} direction="column" alignItems="flex-start" justifyContent="space-between">
<Components.Fieldset legend={label} style={{ width: "100%", backgroundColor: "rgba(255, 255, 0, 0.1)" }}>
<MarkdownContainerBox>
<Components.MDXRenderer format="md" text={(previewDataset[name] as string) || "(값 없음)"} />
<Components.MDXRenderer
format="md"
text={(previewDataset[name] as string) || "(값 없음)"}
baseUrl={baseUrl}
mdxComponents={mdxComponents}
/>
</MarkdownContainerBox>
</Components.Fieldset>
<Typography variant="caption">기존 값을 보려면 여기를 클릭해주세요.</Typography>
Expand All @@ -100,7 +107,12 @@ export const PreviewMarkdownField: React.FC<SharedPreviewFieldProps> = ({ origin
<AccordionDetails>
<Components.Fieldset legend={label} style={{ backgroundColor: "rgba(0, 64, 64, 0.1)" }}>
<MarkdownContainerBox>
<Components.MDXRenderer format="md" text={(originalDataset[name] as string) || "(값 없음)"} />
<Components.MDXRenderer
format="md"
text={(originalDataset[name] as string) || "(값 없음)"}
baseUrl={baseUrl}
mdxComponents={mdxComponents}
/>
</MarkdownContainerBox>
</Components.Fieldset>
</AccordionDetails>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import { Components } from "@frontend/common";
import { useBackendAdminClient, useListQuery } from "@frontend/common/src/hooks/useAdminAPI";
import { CircularProgress, Stack, Table, TableBody, TableCell, TableHead, TableRow, Typography } from "@mui/material";
import { ErrorBoundary, Suspense } from "@suspensive/react";
import * as React from "react";
import { Link } from "react-router-dom";

import { BackendAdminSignInGuard } from "../../elements/admin_signin_guard";
import { ErrorFallback } from "../../elements/error_fallback";

type ListRowType = {
id: string;
Expand All @@ -16,7 +16,7 @@ type ListRowType = {
};

const InnerAdminModificationAuditList: React.FC = ErrorBoundary.with(
{ fallback: Components.ErrorFallback },
{ fallback: ErrorFallback },
Suspense.with({ fallback: <CircularProgress /> }, () => {
const backendAdminClient = useBackendAdminClient();
const listQuery = useListQuery<ListRowType>(backendAdminClient, "modification-audit", "modification-audit");
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import { Components } from "@frontend/common";
import { useBackendAdminClient, useModificationAuditPreviewQuery } from "@frontend/common/src/hooks/useAdminAPI";
import { Box, Button, CircularProgress, Divider, Stack, Typography } from "@mui/material";
import { ErrorBoundary, Suspense } from "@suspensive/react";
Expand All @@ -8,6 +7,7 @@ import { Navigate, useParams } from "react-router-dom";
import { ModificationAuditProperties } from "./components";
import { ApproveSubmitConfirmDialog, RejectSubmitConfirmDialog } from "./dialogs";
import { SubModificationAuditPage } from "./sub_pages";
import { ErrorFallback } from "../../elements/error_fallback";
import { BackendAdminSignInGuard } from "../../elements/admin_signin_guard";

type EditorStateType = { actionStatus?: "approve" | "reject" };
Expand Down Expand Up @@ -67,7 +67,7 @@ const InnerAdminModificationAuditEditor: React.FC = () => {
export const AdminModificationAuditEditor: React.FC = () => {
return (
<BackendAdminSignInGuard>
<ErrorBoundary fallback={Components.ErrorFallback}>
<ErrorBoundary fallback={ErrorFallback}>
<Suspense fallback={<CircularProgress />}>
<InnerAdminModificationAuditEditor />
</Suspense>
Expand Down
6 changes: 4 additions & 2 deletions apps/pyconkr-admin/src/components/pages/page/editor.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import { useParams } from "react-router-dom";
import { PageSectionSchema } from "../../../../../../packages/common/src/schemas/backendAdminAPI";
import { muiTheme } from "../../../styles/globalStyles";
import { addErrorSnackbar } from "../../../utils/snackbar";
import { ErrorFallback } from "../../elements/error_fallback";
import { AdminEditor } from "../../layouts/admin_editor";

type SectionType = PageSectionSchema;
Expand All @@ -33,6 +34,7 @@ type SectionEditorPropType = CommonSectionEditorPropType & {
};

const SectionTextEditor: React.FC<SectionTextEditorPropType> = ({ disabled, defaultValue, onInsertNewSection, onChange, onDelete }) => {
const { baseUrl, mdxComponents } = useCommonContext();
const deleteActionButton = commands.group([], {
name: "delete",
groupName: "delete",
Expand All @@ -51,7 +53,7 @@ const SectionTextEditor: React.FC<SectionTextEditorPropType> = ({ disabled, defa
</Stack>
<Box sx={{ flexGrow: 1, width: "50%", backgroundColor: "#fff" }}>
<ThemeProvider theme={muiTheme}>
<Components.MDXRenderer text={defaultValue || ""} format="mdx" />
<Components.MDXRenderer text={defaultValue || ""} format="mdx" baseUrl={baseUrl} mdxComponents={mdxComponents} />
</ThemeProvider>
</Box>
</Stack>
Expand Down Expand Up @@ -80,7 +82,7 @@ type AdminCMSPageEditorStateType = {
};

export const AdminCMSPageEditor: React.FC = ErrorBoundary.with(
{ fallback: Components.ErrorFallback },
{ fallback: ErrorFallback },
Suspense.with({ fallback: <CircularProgress /> }, () => {
const { id } = useParams<{ id?: string }>();
const { frontendDomain } = useCommonContext();
Expand Down
16 changes: 13 additions & 3 deletions apps/pyconkr-admin/src/components/pages/presentation/editor.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
import { Components } from "@frontend/common";
import { useBackendAdminClient, useCreateMutation, useListQuery, useRemovePreparedMutation, useSchemaQuery, useUpdatePreparedMutation } from "@frontend/common/src/hooks/useAdminAPI";
import {
useBackendAdminClient,
useCreateMutation,
useListQuery,
useRemovePreparedMutation,
useSchemaQuery,
useUpdatePreparedMutation,
} from "@frontend/common/src/hooks/useAdminAPI";
import { useCommonContext } from "@frontend/common/src/hooks/useCommonContext";
import { Autocomplete, Box, Button, Card, CardContent, CircularProgress, Stack, styled, Tab, Tabs, TextField, Typography } from "@mui/material";
import { DateTimePicker, LocalizationProvider } from "@mui/x-date-pickers";
import { AdapterLuxon } from "@mui/x-date-pickers/AdapterLuxon";
Expand All @@ -10,6 +18,7 @@ import { enqueueSnackbar, OptionsObject } from "notistack";
import * as React from "react";
import { useParams } from "react-router-dom";

import { ErrorFallback } from "../../elements/error_fallback";
import { AdminEditor } from "../../layouts/admin_editor";

const DUMMY_UUID = "00000000-0000-4000-8000-000000000000";
Expand Down Expand Up @@ -87,6 +96,7 @@ type AutoCompleteType = {
};

const PresentationSpeakerForm: React.FC<PresentationSpeakerFormPropType> = ({ disabled, schema, speaker, onChange, onRemove }) => {
const { baseUrl, mdxComponents } = useCommonContext();
const [formState, setFormState] = React.useState<PresentationSpeakerFormStateType>({ tab: "ko" });
const setLanguage = (_: React.SyntheticEvent, tab: "ko" | "en") => setFormState((ps) => ({ ...ps, tab }));

Expand Down Expand Up @@ -147,7 +157,7 @@ const PresentationSpeakerForm: React.FC<PresentationSpeakerFormPropType> = ({ di
<Components.MarkdownEditor disabled={disabled} value={speaker[bioField]} name={bioField} onChange={onSpeakerBioChange} />
</Box>
<MDXRendererContainer>
<Components.MDXRenderer text={speaker[bioField]} format="md" />
<Components.MDXRenderer text={speaker[bioField]} format="md" baseUrl={baseUrl} mdxComponents={mdxComponents} />
</MDXRendererContainer>
</Stack>
</MUIStyledFieldset>
Expand Down Expand Up @@ -264,7 +274,7 @@ type PresentationEditorStateType = {
};

export const AdminPresentationEditor: React.FC = ErrorBoundary.with(
{ fallback: Components.ErrorFallback },
{ fallback: ErrorFallback },
Suspense.with({ fallback: <CircularProgress /> }, () => {
const { id } = useParams<{ id?: string }>();

Expand Down
4 changes: 2 additions & 2 deletions apps/pyconkr-admin/src/components/pages/sitemap/list.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import { Components } from "@frontend/common";
import { useBackendAdminClient, useListQuery, useRemovePreparedMutation, useUpdatePreparedMutation } from "@frontend/common/src/hooks/useAdminAPI";
import { buildFlatSiteMap, buildNestedSiteMap } from "@frontend/common/src/utils";
import { Add, Delete, Edit, Save } from "@mui/icons-material";
Expand All @@ -23,6 +22,7 @@ import { GroupOptions, ReactSortable, SortableEvent, SortableOptions } from "rea

import { FlattenedSiteMapSchema, NestedSiteMapSchema } from "../../../../../../packages/common/src/schemas/backendAdminAPI";
import { BackendAdminSignInGuard } from "../../elements/admin_signin_guard";
import { ErrorFallback } from "../../elements/error_fallback";
import { AdminEditor } from "../../layouts/admin_editor";

type FlatSiteMap = FlattenedSiteMapSchema;
Expand Down Expand Up @@ -95,7 +95,7 @@ type InnerSiteMapStateType = {
const ModifyDetectionFields: (keyof FlatSiteMap)[] = ["order", "parent_sitemap"];

const InnerSiteMapList: React.FC = ErrorBoundary.with(
{ fallback: Components.ErrorFallback },
{ fallback: ErrorFallback },
Suspense.with({ fallback: <CircularProgress /> }, () => {
const backendAdminAPIClient = useBackendAdminClient();
const { data } = useListQuery<FlatSiteMap>(backendAdminAPIClient, "cms", "sitemap");
Expand Down
4 changes: 2 additions & 2 deletions apps/pyconkr-admin/src/components/pages/user/editor.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import { Components } from "@frontend/common";
import { useBackendAdminClient, useResetUserPasswordMutation } from "@frontend/common/src/hooks/useAdminAPI";
import { KeyOff } from "@mui/icons-material";
import { Button, ButtonProps, CircularProgress, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle } from "@mui/material";
Expand All @@ -8,6 +7,7 @@ import { useNavigate, useParams } from "react-router-dom";

import { PasswordResultDialog } from "./password_result_dialog";
import { addErrorSnackbar } from "../../../utils/snackbar";
import { ErrorFallback } from "../../elements/error_fallback";
import { AdminEditor } from "../../layouts/admin_editor";

type PageStateType = {
Expand All @@ -18,7 +18,7 @@ type PageStateType = {
};

export const AdminUserExtEditor: React.FC = ErrorBoundary.with(
{ fallback: Components.ErrorFallback },
{ fallback: ErrorFallback },
Suspense.with({ fallback: <CircularProgress /> }, () => {
const { id } = useParams<{ id?: string }>();
const navigate = useNavigate();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ export const PublicFileUploadDialog: React.FC<PublicFileUploadDialogProps> = ({
<Dialog open={open} onClose={onClose} maxWidth="sm" fullWidth>
<DialogTitle children={titleStr} />
<DialogContent>
<Components.DndFileInput onFileChange={setFile} />
<Components.DndFileInput onFileChange={setFile} language={language} />
</DialogContent>
<DialogActions>
<Button variant="contained" loading={loading} children={cancelStr} color="error" onClick={onClose} />
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { Components } from "@frontend/common";
import { useCommonContext } from "@frontend/common/src/hooks/useCommonContext";
import { Box, SelectProps, Stack, styled, Tab, Tabs, TextField, TextFieldProps, Typography, useMediaQuery } from "@mui/material";
import * as React from "react";

Expand Down Expand Up @@ -143,6 +144,7 @@ export const MultiLanguageMarkdownField: React.FC<MultiLanguageMarkdownFieldProp
...props
}) => {
const { language } = useAppContext();
const { baseUrl, mdxComponents } = useCommonContext();
const [fieldState, setFieldState] = React.useState<MultiLanguageFieldState>({ selectedFieldLanguage: language });
const setFieldLanguage = (_: React.SyntheticEvent, selectedFieldLanguage: "ko" | "en") => setFieldState((ps) => ({ ...ps, selectedFieldLanguage }));
const koreanStr = language === "ko" ? "한국어" : "Korean";
Expand Down Expand Up @@ -177,7 +179,7 @@ export const MultiLanguageMarkdownField: React.FC<MultiLanguageMarkdownFieldProp
</Box>
)}
<MDRendererContainer fullWidth={disabled}>
<Components.MDXRenderer text={inputValue || ""} format="md" />
<Components.MDXRenderer text={inputValue || ""} format="md" baseUrl={baseUrl} mdxComponents={mdxComponents} />
</MDRendererContainer>
</Stack>
</FieldContainer>
Expand Down
4 changes: 3 additions & 1 deletion apps/pyconkr/src/components/pages/dynamic_route.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { Components } from "@frontend/common";
import { useBackendClient, usePageQuery } from "@frontend/common/src/hooks/useAPI";
import { useCommonContext } from "@frontend/common/src/hooks/useCommonContext";
import { parseCss } from "@frontend/common/src/utils";
import { BackendAPIClientError } from "@frontend/common/src/apis";
import { CircularProgress, Stack, Theme } from "@mui/material";
Expand Down Expand Up @@ -104,6 +105,7 @@ const WaitedCenteredLoadingPage: React.FC = Suspense.with({ fallback: <CenteredL

const InnerPageRenderer: React.FC<{ id: string }> = Suspense.with({ fallback: <CenteredLoadingPage /> }, ({ id }) => {
const { setAppContext } = useAppContext();
const { baseUrl, mdxComponents } = useCommonContext();
const backendClient = useBackendClient();
const { data } = usePageQuery(backendClient, id);

Expand All @@ -120,7 +122,7 @@ const InnerPageRenderer: React.FC<{ id: string }> = Suspense.with({ fallback: <C
<Stack sx={initialPageStyle(parseCss(data.css))}>
{data.sections.map((s) => (
<Stack sx={initialSectionStyle(parseCss(s.css))} key={s.id}>
<Components.MDXRenderer text={s.body} format="mdx" />
<Components.MDXRenderer text={s.body} format="mdx" baseUrl={baseUrl} mdxComponents={mdxComponents} />
</Stack>
))}
</Stack>
Expand Down
Loading