Skip to content

Commit 4b1aafd

Browse files
authored
Merge pull request #1125 from GetStream/mads/date-fromnow-undefined
2 parents f2a01c3 + dab0ac9 commit 4b1aafd

File tree

4 files changed

+78
-20
lines changed

4 files changed

+78
-20
lines changed

package/src/components/ImageGallery/components/ImageGalleryHeader.tsx

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import { useOverlayContext } from '../../../contexts/overlayContext/OverlayConte
1515
import { useTheme } from '../../../contexts/themeContext/ThemeContext';
1616
import {
1717
isDayOrMoment,
18+
TDateTimeParserOutput,
1819
useTranslationContext,
1920
} from '../../../contexts/translationContext/TranslationContext';
2021
import { Close } from '../../../icons';
@@ -104,16 +105,29 @@ export const ImageGalleryHeader = <Us extends UnknownType = DefaultUserType>(pro
104105
const parsedDate = photo ? tDateTimeParser(photo?.created_at) : null;
105106

106107
/**
107-
* .calendar is required on moment types, but in reality it
108-
* is unavailable on first render. We therefore check if it
109-
* is available and call it, otherwise we call .fromNow.
108+
* .calendar and .fromNow can be initialized after the first render,
109+
* and attempting to access them at that time will cause an error
110+
* to be thrown.
111+
*
112+
* This falls back to null if neither exist.
110113
*/
111-
const date =
112-
parsedDate && isDayOrMoment(parsedDate)
113-
? parsedDate.calendar
114-
? parsedDate.calendar()
115-
: parsedDate.fromNow()
116-
: null;
114+
const getDateObject = (date: TDateTimeParserOutput | null) => {
115+
if (date === null || !isDayOrMoment(date)) {
116+
return null;
117+
}
118+
119+
if (date.calendar) {
120+
return date.calendar();
121+
}
122+
123+
if (date.fromNow) {
124+
return date.fromNow();
125+
}
126+
127+
return null;
128+
};
129+
130+
const date = getDateObject(parsedDate);
117131

118132
const headerStyle = useAnimatedStyle<ViewStyle>(() => ({
119133
opacity: opacity.value,
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import React from 'react';
2+
3+
import type Animated from 'react-native-reanimated';
4+
5+
import { render } from '@testing-library/react-native';
6+
7+
import { ThemeProvider } from '../../../../contexts/themeContext/ThemeContext';
8+
import { ImageGalleryHeader } from '../ImageGalleryHeader';
9+
10+
it('doesnt fail if fromNow is not available on first render', () => {
11+
try {
12+
const { getAllByText } = render(
13+
<ThemeProvider>
14+
<ImageGalleryHeader
15+
opacity={1 as unknown as Animated.SharedValue<number>}
16+
photo={{
17+
id: 'id',
18+
uri: 'file:///bogus/uri/to/photo.jpg',
19+
}}
20+
visible={1 as unknown as Animated.SharedValue<number>}
21+
/>
22+
</ThemeProvider>,
23+
);
24+
25+
expect(getAllByText('Unknown User')).toBeTruthy();
26+
} catch (error: unknown) {
27+
if (error instanceof Error) {
28+
throw new Error(`Error encountered on first render of ImageGalleryHeader: ${error.message}`);
29+
}
30+
}
31+
});

package/src/components/Message/MessageSimple/utils/renderText.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,13 @@ export const renderText = <
252252
};
253253

254254
const list: ReactNodeOutput = (node, output, state) => (
255-
<ListOutput node={node} output={output} state={state} styles={styles} />
255+
<ListOutput
256+
key={`list-${state.key}`}
257+
node={node}
258+
output={output}
259+
state={state}
260+
styles={styles}
261+
/>
256262
);
257263

258264
const customRules = {

package/yarn.lock

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5544,11 +5544,16 @@ flush-write-stream@^1.0.0:
55445544
inherits "^2.0.3"
55455545
readable-stream "^2.3.6"
55465546

5547-
follow-redirects@^1.0.0, follow-redirects@^1.10.0:
5547+
follow-redirects@^1.0.0:
55485548
version "1.14.7"
55495549
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.7.tgz#2004c02eb9436eee9a21446a6477debf17e81685"
55505550
integrity sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ==
55515551

5552+
follow-redirects@^1.14.4:
5553+
version "1.14.8"
5554+
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.8.tgz#016996fb9a11a100566398b1c6839337d7bfa8fc"
5555+
integrity sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==
5556+
55525557
for-in@^1.0.2:
55535558
version "1.0.2"
55545559
resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
@@ -6414,21 +6419,14 @@ is-ci@^2.0.0:
64146419
dependencies:
64156420
ci-info "^2.0.0"
64166421

6417-
is-core-module@^2.2.0, is-core-module@^2.8.0:
6422+
is-core-module@^2.2.0:
64186423
version "2.8.0"
64196424
resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.0.tgz#0321336c3d0925e497fd97f5d95cb114a5ccd548"
64206425
integrity sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==
64216426
dependencies:
64226427
has "^1.0.3"
64236428

6424-
is-core-module@^2.8.0:
6425-
version "2.8.1"
6426-
resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211"
6427-
integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==
6428-
dependencies:
6429-
has "^1.0.3"
6430-
6431-
is-core-module@^2.8.0:
6429+
is-core-module@^2.8.0, is-core-module@^2.8.1:
64326430
version "2.8.1"
64336431
resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211"
64346432
integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==
@@ -10248,6 +10246,15 @@ resolve@^1.10.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.1
1024810246
is-core-module "^2.2.0"
1024910247
path-parse "^1.0.6"
1025010248

10249+
resolve@^1.20.0:
10250+
version "1.22.0"
10251+
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198"
10252+
integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==
10253+
dependencies:
10254+
is-core-module "^2.8.1"
10255+
path-parse "^1.0.7"
10256+
supports-preserve-symlinks-flag "^1.0.0"
10257+
1025110258
resolve@^2.0.0-next.3:
1025210259
version "2.0.0-next.3"
1025310260
resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.3.tgz#d41016293d4a8586a39ca5d9b5f15cbea1f55e46"

0 commit comments

Comments
 (0)