Fix join group modal

This commit is contained in:
Jamie Kyle 2025-04-15 13:01:17 -07:00 committed by GitHub
commit ecb19d5a10
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
9 changed files with 110 additions and 61 deletions

View file

@ -70,6 +70,26 @@ export const FunEmojiLocalizationProvider = memo(
} }
); );
export type FunEmptyEmojiLocalizationProviderProps = Readonly<{
children: ReactNode;
}>;
export function FunDefaultEnglishEmojiLocalizationProvider(
props: FunEmptyEmojiLocalizationProviderProps
): JSX.Element {
const context = useMemo(() => {
return {
emojiSearchIndex: getEmojiDefaultEnglishSearchIndex(),
emojiLocalizerIndex: getEmojiDefaultEnglishLocalizerIndex(),
};
}, []);
return (
<FunEmojiLocalizationContext.Provider value={context}>
{props.children}
</FunEmojiLocalizationContext.Provider>
);
}
function useLocaleEmojiList(i18n: LocalizerType): LocaleEmojiListType | null { function useLocaleEmojiList(i18n: LocalizerType): LocaleEmojiListType | null {
const locale = useMemo(() => i18n.getLocale(), [i18n]); const locale = useMemo(() => i18n.getLocale(), [i18n]);

View file

@ -6,10 +6,13 @@ import { render } from 'react-dom';
import { ClearingData } from '../components/ClearingData'; import { ClearingData } from '../components/ClearingData';
import { deleteAllData } from './deleteAllData'; import { deleteAllData } from './deleteAllData';
import { FunDefaultEnglishEmojiLocalizationProvider } from '../components/fun/FunEmojiLocalizationProvider';
export function renderClearingDataView(): void { export function renderClearingDataView(): void {
render( render(
<ClearingData deleteAllData={deleteAllData} i18n={window.i18n} />, <FunDefaultEnglishEmojiLocalizationProvider>
<ClearingData deleteAllData={deleteAllData} i18n={window.i18n} />
</FunDefaultEnglishEmojiLocalizationProvider>,
document.getElementById('app-container') document.getElementById('app-container')
); );
} }

View file

@ -11,6 +11,7 @@ import type { Store } from 'redux';
import { ModalHost } from '../../components/ModalHost'; import { ModalHost } from '../../components/ModalHost';
import type { SmartGroupV2JoinDialogProps } from '../smart/GroupV2JoinDialog'; import type { SmartGroupV2JoinDialogProps } from '../smart/GroupV2JoinDialog';
import { SmartGroupV2JoinDialog } from '../smart/GroupV2JoinDialog'; import { SmartGroupV2JoinDialog } from '../smart/GroupV2JoinDialog';
import { FunEmojiLocalizationProvider } from '../../components/fun/FunEmojiLocalizationProvider';
export const createGroupV2JoinModal = ( export const createGroupV2JoinModal = (
store: Store, store: Store,
@ -20,9 +21,11 @@ export const createGroupV2JoinModal = (
return ( return (
<Provider store={store}> <Provider store={store}>
<ModalHost modalName="createGroupV2JoinModal" onClose={onClose}> <FunEmojiLocalizationProvider i18n={window.i18n}>
<SmartGroupV2JoinDialog {...props} /> <ModalHost modalName="createGroupV2JoinModal" onClose={onClose}>
</ModalHost> <SmartGroupV2JoinDialog {...props} />
</ModalHost>
</FunEmojiLocalizationProvider>
</Provider> </Provider>
); );
}; };

View file

@ -9,6 +9,7 @@ import * as log from '../logging/log';
import { ProgressModal } from '../components/ProgressModal'; import { ProgressModal } from '../components/ProgressModal';
import { clearTimeoutIfNecessary } from './clearTimeoutIfNecessary'; import { clearTimeoutIfNecessary } from './clearTimeoutIfNecessary';
import { sleep } from './sleep'; import { sleep } from './sleep';
import { FunDefaultEnglishEmojiLocalizationProvider } from '../components/fun/FunEmojiLocalizationProvider';
export async function longRunningTaskWrapper<T>({ export async function longRunningTaskWrapper<T>({
name, name,
@ -31,7 +32,12 @@ export async function longRunningTaskWrapper<T>({
progressNode = document.createElement('div'); progressNode = document.createElement('div');
log.info(`longRunningTaskWrapper/${idLog}: Creating spinner`); log.info(`longRunningTaskWrapper/${idLog}: Creating spinner`);
render(<ProgressModal i18n={window.i18n} />, progressNode); render(
<FunDefaultEnglishEmojiLocalizationProvider>
<ProgressModal i18n={window.i18n} />
</FunDefaultEnglishEmojiLocalizationProvider>,
progressNode
);
spinnerStart = Date.now(); spinnerStart = Date.now();
}, TWO_SECONDS); }, TWO_SECONDS);

View file

@ -4,6 +4,7 @@
import React from 'react'; import React from 'react';
import { render, unmountComponentAtNode } from 'react-dom'; import { render, unmountComponentAtNode } from 'react-dom';
import { ConfirmationDialog } from '../components/ConfirmationDialog'; import { ConfirmationDialog } from '../components/ConfirmationDialog';
import { FunDefaultEnglishEmojiLocalizationProvider } from '../components/fun/FunEmojiLocalizationProvider';
type ConfirmationDialogViewProps = { type ConfirmationDialogViewProps = {
onTopOfEverything?: boolean; onTopOfEverything?: boolean;
@ -55,33 +56,37 @@ export function showConfirmationDialog(
confirmationDialogPreviousFocus = document.activeElement as HTMLElement; confirmationDialogPreviousFocus = document.activeElement as HTMLElement;
render( render(
<ConfirmationDialog <FunDefaultEnglishEmojiLocalizationProvider>
dialogName={options.dialogName} <ConfirmationDialog
onTopOfEverything={options.onTopOfEverything} dialogName={options.dialogName}
actions={[ onTopOfEverything={options.onTopOfEverything}
{ actions={[
action: () => { {
options.resolve(); action: () => {
options.resolve();
},
style: options.confirmStyle,
text: options.okText || window.i18n('icu:ok'),
}, },
style: options.confirmStyle, ]}
text: options.okText || window.i18n('icu:ok'), cancelText={options.cancelText || window.i18n('icu:cancel')}
}, i18n={window.i18n}
]} onCancel={() => {
cancelText={options.cancelText || window.i18n('icu:cancel')} if (options.reject) {
i18n={window.i18n} options.reject(
onCancel={() => { new Error('showConfirmationDialog: onCancel called')
if (options.reject) { );
options.reject(new Error('showConfirmationDialog: onCancel called')); }
} }}
}} onClose={() => {
onClose={() => { removeConfirmationDialog();
removeConfirmationDialog(); }}
}} title={options.title}
title={options.title} noMouseClose={options.noMouseClose}
noMouseClose={options.noMouseClose} >
> {options.description}
{options.description} </ConfirmationDialog>
</ConfirmationDialog>, </FunDefaultEnglishEmojiLocalizationProvider>,
confirmationDialogViewNode confirmationDialogViewNode
); );
} }

View file

@ -7,19 +7,22 @@ import ReactDOM from 'react-dom';
import { About } from '../../components/About'; import { About } from '../../components/About';
import { i18n } from '../sandboxedInit'; import { i18n } from '../sandboxedInit';
import { strictAssert } from '../../util/assert'; import { strictAssert } from '../../util/assert';
import { FunDefaultEnglishEmojiLocalizationProvider } from '../../components/fun/FunEmojiLocalizationProvider';
const { AboutWindowProps } = window.Signal; const { AboutWindowProps } = window.Signal;
strictAssert(AboutWindowProps, 'window values not provided'); strictAssert(AboutWindowProps, 'window values not provided');
ReactDOM.render( ReactDOM.render(
<About <FunDefaultEnglishEmojiLocalizationProvider>
closeAbout={() => window.SignalContext.executeMenuRole('close')} <About
appEnv={AboutWindowProps.appEnv} closeAbout={() => window.SignalContext.executeMenuRole('close')}
platform={AboutWindowProps.platform} appEnv={AboutWindowProps.appEnv}
arch={AboutWindowProps.arch} platform={AboutWindowProps.platform}
i18n={i18n} arch={AboutWindowProps.arch}
version={window.SignalContext.getVersion()} i18n={i18n}
/>, version={window.SignalContext.getVersion()}
/>
</FunDefaultEnglishEmojiLocalizationProvider>,
document.getElementById('app') document.getElementById('app')
); );

View file

@ -4,6 +4,7 @@
import React from 'react'; import React from 'react';
import { render } from 'react-dom'; import { render } from 'react-dom';
import { DebugLogWindow } from '../../components/DebugLogWindow'; import { DebugLogWindow } from '../../components/DebugLogWindow';
import { FunDefaultEnglishEmojiLocalizationProvider } from '../../components/fun/FunEmojiLocalizationProvider';
import { i18n } from '../sandboxedInit'; import { i18n } from '../sandboxedInit';
import { strictAssert } from '../../util/assert'; import { strictAssert } from '../../util/assert';
@ -12,12 +13,14 @@ const { DebugLogWindowProps } = window.Signal;
strictAssert(DebugLogWindowProps, 'window values not provided'); strictAssert(DebugLogWindowProps, 'window values not provided');
render( render(
<DebugLogWindow <FunDefaultEnglishEmojiLocalizationProvider>
closeWindow={() => window.SignalContext.executeMenuRole('close')} <DebugLogWindow
downloadLog={DebugLogWindowProps.downloadLog} closeWindow={() => window.SignalContext.executeMenuRole('close')}
i18n={i18n} downloadLog={DebugLogWindowProps.downloadLog}
fetchLogs={DebugLogWindowProps.fetchLogs} i18n={i18n}
uploadLogs={DebugLogWindowProps.uploadLogs} fetchLogs={DebugLogWindowProps.fetchLogs}
/>, uploadLogs={DebugLogWindowProps.uploadLogs}
/>
</FunDefaultEnglishEmojiLocalizationProvider>,
document.getElementById('app') document.getElementById('app')
); );

View file

@ -7,6 +7,7 @@ import ReactDOM from 'react-dom';
import { PermissionsPopup } from '../../components/PermissionsPopup'; import { PermissionsPopup } from '../../components/PermissionsPopup';
import { i18n } from '../sandboxedInit'; import { i18n } from '../sandboxedInit';
import { strictAssert } from '../../util/assert'; import { strictAssert } from '../../util/assert';
import { FunDefaultEnglishEmojiLocalizationProvider } from '../../components/fun/FunEmojiLocalizationProvider';
const { PermissionsWindowProps } = window.Signal; const { PermissionsWindowProps } = window.Signal;
@ -26,11 +27,13 @@ if (forCalling) {
} }
ReactDOM.render( ReactDOM.render(
<PermissionsPopup <FunDefaultEnglishEmojiLocalizationProvider>
i18n={i18n} <PermissionsPopup
message={message} i18n={i18n}
onAccept={PermissionsWindowProps.onAccept} message={message}
onClose={PermissionsWindowProps.onClose} onAccept={PermissionsWindowProps.onAccept}
/>, onClose={PermissionsWindowProps.onClose}
/>
</FunDefaultEnglishEmojiLocalizationProvider>,
document.getElementById('app') document.getElementById('app')
); );

View file

@ -9,6 +9,7 @@ import { i18n } from '../sandboxedInit';
import { strictAssert } from '../../util/assert'; import { strictAssert } from '../../util/assert';
import { drop } from '../../util/drop'; import { drop } from '../../util/drop';
import { parseEnvironment, setEnvironment } from '../../environment'; import { parseEnvironment, setEnvironment } from '../../environment';
import { FunDefaultEnglishEmojiLocalizationProvider } from '../../components/fun/FunEmojiLocalizationProvider';
const { ScreenShareWindowProps } = window.Signal; const { ScreenShareWindowProps } = window.Signal;
@ -28,15 +29,17 @@ function render() {
strictAssert(ScreenShareWindowProps, 'window values not provided'); strictAssert(ScreenShareWindowProps, 'window values not provided');
ReactDOM.render( ReactDOM.render(
<div className="App dark-theme"> <FunDefaultEnglishEmojiLocalizationProvider>
<CallingScreenSharingController <div className="App dark-theme">
i18n={i18n} <CallingScreenSharingController
onCloseController={onCloseController} i18n={i18n}
onStopSharing={ScreenShareWindowProps.onStopSharing} onCloseController={onCloseController}
status={ScreenShareWindowProps.getStatus()} onStopSharing={ScreenShareWindowProps.onStopSharing}
presentedSourceName={ScreenShareWindowProps.presentedSourceName} status={ScreenShareWindowProps.getStatus()}
/> presentedSourceName={ScreenShareWindowProps.presentedSourceName}
</div>, />
</div>
</FunDefaultEnglishEmojiLocalizationProvider>,
document.getElementById('app') document.getElementById('app')
); );