) => {
const configError = useCallback(
(error?: string) => {
return (
{t('app.app.errorHeader')}
{t('app.app.configErrors')}:
{error ?? config.error}
{t('app.app.checkConfigYml')}
);
},
[config.error, t],
);
const handleLogin = useCallback(
(credentials: Credentials) => {
loginUser(credentials);
},
[loginUser],
);
const AuthComponent = useMemo(() => {
if (!config.config) {
return null;
}
const backend = currentBackend(config.config);
return backend?.authComponent();
}, [config.config]);
const authenticationPage = useMemo(() => {
if (!config.config) {
return null;
}
if (AuthComponent == null) {
return (
{t('app.app.waitingBackend')}
);
}
return (
history.replace('/')}
t={t}
/>
);
}, [AuthComponent, auth.error, auth.isFetching, config.config, handleLogin, t]);
const defaultPath = useMemo(() => getDefaultPath(collections), [collections]);
const { pathname } = useLocation();
React.useEffect(() => {
if (!/\/collections\/[a-zA-Z0-9_-]+\/entries\/[a-zA-Z0-9_-]+/g.test(pathname)) {
discardDraft();
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [pathname]);
const content = useMemo(() => {
if (!user) {
return authenticationPage;
}
return (
<>
{isFetching && }
} />
} />
} />
}
/>
} />
}
/>
}
/>
}
/>
}
/>
}
/>
}
/>
} />
} />
{useMediaLibrary ? : null}
>
);
}, [authenticationPage, collections, defaultPath, isFetching, useMediaLibrary, user]);
if (!config.config) {
return configError(t('app.app.configNotFound'));
}
if (config.error) {
return configError();
}
if (config.isFetching) {
return {t('app.app.loadingConfig')};
}
return (
<>
<>
{content}
>
>
);
};
function mapStateToProps(state: RootState) {
const { auth, config, collections, globalUI, mediaLibrary, scroll } = state;
const user = auth.user;
const isFetching = globalUI.isFetching;
const useMediaLibrary = !mediaLibrary.externalLibrary;
const scrollSyncEnabled = scroll.isScrolling;
return {
auth,
config,
collections,
user,
isFetching,
useMediaLibrary,
scrollSyncEnabled,
};
}
const mapDispatchToProps = {
loginUser: loginUserAction,
discardDraft: discardDraftAction,
};
const connector = connect(mapStateToProps, mapDispatchToProps);
export type AppProps = ConnectedProps;
export default connector(translate()(App) as ComponentType);