// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. import {DatabaseProvider} from '@nozbe/watermelondb/react'; import React, {type ComponentType, useEffect, useState} from 'react'; import DeviceInfoProvider from '@context/device'; 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 {secureGetFromRecord} from '@utils/types'; import type {Database} from '@nozbe/watermelondb'; import type {PersistenceFlag} from '@typings/database/models/app/servers'; import type ServersModel from '@typings/database/models/app/servers'; type State = { database: Database; serverUrl: string; serverDisplayName: string; persistenceFlag: PersistenceFlag; }; export function withServerDatabase(Component: ComponentType): ComponentType { return function ServerDatabaseComponent(props: T) { const [state, setState] = useState(); const observer = (servers: ServersModel[]) => { const server = servers?.length ? servers.reduce((a, b) => (b.lastActiveAt > a.lastActiveAt ? b : a), ) : undefined; if (server) { const database = secureGetFromRecord(DatabaseManager.serverDatabases, server.url)?.database; if (database) { setState({ database, serverUrl: server.url, serverDisplayName: server.displayName, persistenceFlag: server.persistenceFlag, }); } } else { setState(undefined); } }; useEffect(() => { const subscription = subscribeActiveServers(observer); return () => { subscription?.unsubscribe(); }; }, []); if (!state?.database) { return null; } // Flip the key when the adapter changes (on-disk ↔ in-memory) so React unmounts and // remounts the subtree; withObservables uses empty triggerProps and only binds to the // database at mount, so without a remount it would stay subscribed to the dropped instance. const dbKey = state.persistenceFlag === 'zero-persistence' ? `${state.serverUrl}.mem` : state.serverUrl; return ( ); }; }