Files
mattermost-mobile/app/database/components/index.tsx
Elias Nahum 784b05fe97 Upgrade Dependencies (#7299)
* upgrade reanimated

* update devDependencies

* upgrade react-intl

* update react-native and some dependencies

* update react-native-permissions

* update RN

* use Share sheet for Report a problem

* update Sentry

* remove step to downloadWebRTC

* update detox deps

* feedback review
2023-04-21 12:16:54 -04:00

75 lines
2.5 KiB
TypeScript

// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import DatabaseProvider from '@nozbe/watermelondb/DatabaseProvider';
import React, {type ComponentType, useEffect, useState} from 'react';
import ServerProvider from '@context/server';
import ThemeProvider from '@context/theme';
import UserLocaleProvider from '@context/user_locale';
import DatabaseManager from '@database/manager';
import {subscribeActiveServers} from '@database/subscription/servers';
import type {Database} from '@nozbe/watermelondb';
import type ServersModel from '@typings/database/models/app/servers';
type State = {
database: Database;
serverUrl: string;
serverDisplayName: string;
};
export function withServerDatabase<T extends JSX.IntrinsicAttributes>(Component: ComponentType<T>): ComponentType<T> {
return function ServerDatabaseComponent(props: T) {
const [state, setState] = useState<State | undefined>();
const observer = (servers: ServersModel[]) => {
const server = servers?.length ? servers.reduce((a, b) =>
(b.lastActiveAt > a.lastActiveAt ? b : a),
) : undefined;
if (server) {
const database =
DatabaseManager.serverDatabases[server.url]?.database;
if (database) {
setState({
database,
serverUrl: server.url,
serverDisplayName: server.displayName,
});
}
} else {
setState(undefined);
}
};
useEffect(() => {
const subscription = subscribeActiveServers(observer);
return () => {
subscription?.unsubscribe();
};
}, []);
if (!state?.database) {
return null;
}
return (
<DatabaseProvider
database={state.database}
key={state.serverUrl}
>
<UserLocaleProvider database={state.database}>
<ServerProvider server={{displayName: state.serverDisplayName, url: state.serverUrl}}>
<ThemeProvider database={state.database}>
<Component {...props}/>
</ThemeProvider>
</ServerProvider>
</UserLocaleProvider>
</DatabaseProvider>
);
};
}