Mobile: Fixes #11864: Fix voice recorder crash (#11876)

This commit is contained in:
Henry Heino
2025-02-23 05:53:28 -08:00
committed by GitHub
parent 01a62acfdf
commit 5143fae0f6
3 changed files with 14 additions and 19 deletions

View File

@@ -14,7 +14,7 @@ import { Text } from 'react-native-paper';
import { AndroidAudioEncoder, AndroidOutputFormat, IOSAudioQuality, IOSOutputFormat, RecordingOptions } from 'expo-av/build/Audio';
import time from '@joplin/lib/time';
import { toFileExtension } from '@joplin/lib/mime-utils';
import { formatMsToDurationLocal } from '@joplin/utils/time';
import { formatMsToDurationCompat } from '@joplin/utils/time';
const logger = Logger.create('AudioRecording');
@@ -212,7 +212,7 @@ const AudioRecordingBanner: React.FC<Props> = props => {
const renderDuration = () => {
if (recordingState !== RecorderState.Recording) return null;
const durationValue = formatMsToDurationLocal(duration);
const durationValue = formatMsToDurationCompat(duration);
return <Text
accessibilityLabel={_('Duration: %s', durationValue)}
accessibilityRole='timer'

View File

@@ -1,12 +1,13 @@
import { formatMsToDurationLocal, Hour, Minute } from './time';
import { formatMsToDurationCompat, Hour, Minute, Second } from './time';
describe('time', () => {
test.each([
[0, '0:00'],
[2500, '0:02'],
[Minute * 3, '3:00'],
[Hour * 4 + Minute * 3, '4:03:00'],
[Hour * 25, '0000-00-01T01:00'],
[Hour + Minute * 3, '63:00'],
[Hour + Minute * 3 + Second, '63:01'],
])('should support formatting durations', (input, expected) => {
expect(formatMsToDurationLocal(input)).toBe(expected);
expect(formatMsToDurationCompat(input)).toBe(expected);
});
});

View File

@@ -10,8 +10,6 @@ import * as dayjs from 'dayjs';
// - import * as dayJsRelativeTimeType causes a runtime error.
import type * as dayJsRelativeTimeType from 'dayjs/plugin/relativeTime';
const dayJsRelativeTime: typeof dayJsRelativeTimeType = require('dayjs/plugin/relativeTime');
import type * as dayJsDurationType from 'dayjs/plugin/duration';
const dayJsDuration: typeof dayJsDurationType = require('dayjs/plugin/duration');
const supportedLocales: Record<string, unknown> = {
'ar': require('dayjs/locale/ar'),
@@ -65,7 +63,6 @@ export const Week = 7 * Day;
export const Month = 30 * Day;
function initDayJs() {
dayjs.extend(dayJsDuration);
dayjs.extend(dayJsRelativeTime);
}
@@ -161,14 +158,11 @@ export const formatDateTimeLocalToMs = (anything: string) => {
return dayjs(anything).unix() * 1000;
};
export const formatMsToDurationLocal = (ms: number) => {
let format;
if (ms < Hour) {
format = 'm:ss';
} else if (ms < Day) {
format = 'H:mm:ss';
} else {
format = 'YYYY-MM-DDTHH:mm';
}
return dayjs.duration(ms).format(format);
export const formatMsToDurationCompat = (ms: number) => {
// Avoid using dayjs (and @joplin/utils/time) for formatting here.
// See https://github.com/laurent22/joplin/issues/11864
const seconds = Math.floor(ms / Second) % 60;
const minutes = Math.floor(ms / Minute);
const paddedSeconds = `${seconds}`.padStart(2, '0');
return `${minutes}:${paddedSeconds}`;
};