Skip to content

Commit

Permalink
Merge pull request #1416 from finos/typescript-fixes
Browse files Browse the repository at this point in the history
typescript tweaks
  • Loading branch information
heswell authored Jul 2, 2024
2 parents 2550f36 + 406183f commit 132bcf0
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 22 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import type { ThemeMode, VuuUser } from "@finos/vuu-utils";
import type { VuuUser } from "@finos/vuu-utils";
import { createContext } from "react";
import { SettingsSchema } from "../application-settings/SettingsForm";
import { VuuRowDataItemType } from "packages/vuu-protocol-types";

// export interface CoreSettings {
// themeMode: ThemeMode;
Expand All @@ -12,9 +13,12 @@ const Guest: VuuUser = {
};

export interface ApplicationContextProps {
onApplicationSettingChanged: (propertyName: string, value: unknown) => void;
applicationSettings: Record<string, string | number | boolean>;
applicationSettingsSchema: SettingsSchema;
onApplicationSettingChanged: (
propertyName: string,
value: VuuRowDataItemType
) => void;
applicationSettings?: Record<string, string | number | boolean>;
applicationSettingsSchema?: SettingsSchema;
user: VuuUser;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,25 +10,36 @@ import {
ApplicationContextProps,
} from "./ApplicationContext";
import { SaltProvider } from "@salt-ds/core";
import { VuuRowDataItemType } from "packages/vuu-protocol-types";

export interface ApplicationProviderProps
extends Partial<ApplicationContextProps> {
children: ReactNode;
}

const getThemeMode = (
applicationSettings?: Record<string, string | number | boolean>
) => {
const themeMode = applicationSettings?.themeMode;
if (themeMode === "light" || themeMode === "dark") {
return themeMode;
}
return "light";
};

export const ApplicationProvider = ({
children,
applicationSettings: settingsProp,
applicationSettingsSchema,
user,
}: ApplicationProviderProps): ReactElement => {
const context = useContext(ApplicationContext);
const [applicationSettings, setSettings] = useState(
settingsProp ?? context.applicationSettings
);
const [applicationSettings, setSettings] = useState<
Record<string, string | number | boolean>
>(settingsProp ?? {});

const onApplicationSettingChanged = useCallback(
(propertyName: string, value: unknown) => {
(propertyName: string, value: VuuRowDataItemType) => {
setSettings((s) => ({ ...s, [propertyName]: value }));
},
[]
Expand All @@ -47,7 +58,7 @@ export const ApplicationProvider = ({
<SaltProvider
theme="vuu-theme"
density="high"
mode={applicationSettings.themeMode}
mode={getThemeMode(applicationSettings)}
>
{children}
</SaltProvider>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
import { useComponentCssInjection } from "@salt-ds/styles";
import { useWindow } from "@salt-ds/window";
import { HTMLAttributes } from "react";
import { SettingsForm, SettingsSchema } from "./SettingsForm";
import { SettingsForm } from "./SettingsForm";

import applicationSettingsPanelCss from "./ApplicationSettingsPanel.css";
import { useApplicationSettings } from "../application-provider";

// Props for Panel
export interface ApplicatonSettingsPanelProps
extends HTMLAttributes<HTMLDivElement> {}
export type ApplicatonSettingsPanelProps = HTMLAttributes<HTMLDivElement>;

const classBase = "vuuApplicationSettingsPanel";

Expand All @@ -19,7 +18,7 @@ export const ApplicationSettingsPanel = ({

const {
onApplicationSettingChanged,
applicationSettings,
applicationSettings = {},
applicationSettingsSchema,
} = useApplicationSettings();

Expand All @@ -29,13 +28,20 @@ export const ApplicationSettingsPanel = ({
window: targetWindow,
});

return (
<div {...htmlAttributes} className={classBase}>
<SettingsForm
applicationSettingsSchema={applicationSettingsSchema}
applicationSettings={applicationSettings}
onApplicationSettingChanged={onApplicationSettingChanged}
/>
</div>
);
// Without a schema, we can't render a form
// We could render a list of input boxes but lets require a schema for now.
if (applicationSettingsSchema) {
return (
<div {...htmlAttributes} className={classBase}>
<SettingsForm
applicationSettingsSchema={applicationSettingsSchema}
applicationSettings={applicationSettings}
onApplicationSettingChanged={onApplicationSettingChanged}
/>
</div>
);
} else {
console.warn("no settingsSchema provided to ApplicationSettingsPanel");
return null;
}
};

0 comments on commit 132bcf0

Please sign in to comment.