stash/ui/v2.5/src/components/FrontPage/FrontPage.tsx
DingDongSoLong4 5dbf1797e9
Details redesign tweaks and refactoring (#3995)
* Move loadStickyHeader to src/hooks
* intl stashIDs
* Scroll to top on component mount
* Add id to gallery cover image and tweak merge functions
* Add useTitleProps hook
* Also scroll to top on list pages
* Refactor loaders and tabs
* Use classnames
* Add DetailImage
2023-08-08 09:26:22 +10:00

86 lines
2.1 KiB
TypeScript

import React, { useState } from "react";
import { FormattedMessage, useIntl } from "react-intl";
import { useConfigureUI } from "src/core/StashService";
import { LoadingIndicator } from "../Shared/LoadingIndicator";
import { Button } from "react-bootstrap";
import { FrontPageConfig } from "./FrontPageConfig";
import { useToast } from "src/hooks/Toast";
import { Control } from "./Control";
import { ConfigurationContext } from "src/hooks/Config";
import {
FrontPageContent,
generateDefaultFrontPageContent,
IUIConfig,
} from "src/core/config";
import { useScrollToTopOnMount } from "src/hooks/scrollToTop";
const FrontPage: React.FC = () => {
const intl = useIntl();
const Toast = useToast();
const [isEditing, setIsEditing] = useState(false);
const [saving, setSaving] = useState(false);
const [saveUI] = useConfigureUI();
const { configuration, loading } = React.useContext(ConfigurationContext);
useScrollToTopOnMount();
async function onUpdateConfig(content?: FrontPageContent[]) {
setIsEditing(false);
if (!content) {
return;
}
setSaving(true);
try {
await saveUI({
variables: {
input: {
...configuration?.ui,
frontPageContent: content,
},
},
});
} catch (e) {
Toast.error(e);
}
setSaving(false);
}
if (loading || saving) {
return <LoadingIndicator />;
}
if (isEditing) {
return <FrontPageConfig onClose={(content) => onUpdateConfig(content)} />;
}
const ui = (configuration?.ui ?? {}) as IUIConfig;
if (!ui.frontPageContent) {
const defaultContent = generateDefaultFrontPageContent(intl);
onUpdateConfig(defaultContent);
}
const { frontPageContent } = ui;
return (
<div className="recommendations-container">
<div>
{frontPageContent?.map((content: FrontPageContent, i) => (
<Control key={i} content={content} />
))}
</div>
<div className="recommendations-footer">
<Button onClick={() => setIsEditing(true)}>
<FormattedMessage id={"actions.customise"} />
</Button>
</div>
</div>
);
};
export default FrontPage;