@tactics/toddle-styleguide 1.2.6 → 1.2.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/App.tsx +8 -0
  2. package/package.json +1 -1
  3. package/src/components/atoms/calendar/__snapshots__/calendar.test.js.snap +18 -18
  4. package/src/components/atoms/quick-message/__snapshots__/quick-message.test.js.snap +72 -0
  5. package/src/components/atoms/quick-message/quick-message.component.d.ts +7 -0
  6. package/src/components/atoms/quick-message/quick-message.component.tsx +32 -0
  7. package/src/components/atoms/quick-message/quick-message.preview.d.ts +1 -0
  8. package/src/components/atoms/quick-message/quick-message.preview.tsx +33 -0
  9. package/src/components/atoms/quick-message/quick-message.styles.d.ts +14 -0
  10. package/src/components/atoms/quick-message/quick-message.styles.js +18 -0
  11. package/src/components/atoms/quick-message/quick-message.test.js +26 -0
  12. package/src/components/molecules/button/__snapshots__/button.test.js.snap +72 -0
  13. package/src/components/molecules/button/button.component.d.ts +1 -1
  14. package/src/components/molecules/button/button.component.tsx +8 -15
  15. package/src/components/molecules/button/button.preview.tsx +5 -0
  16. package/src/components/molecules/button/button.test.js +6 -0
  17. package/src/components/molecules/failed-to-send/__snapshots__/failed-bubble.test.js.snap +2 -0
  18. package/src/components/molecules/failed-to-send/failed-bubble.component.d.ts +4 -3
  19. package/src/components/molecules/failed-to-send/failed-bubble.component.tsx +6 -4
  20. package/src/components/molecules/failed-to-send/failed-bubble.test.js +56 -0
  21. package/src/components/molecules/send-bubble/__snapshots__/send-text-bubble.test.js.snap +12 -0
  22. package/src/components/molecules/send-bubble/send-text-bubble.component.d.ts +4 -3
  23. package/src/components/molecules/send-bubble/send-text-bubble.component.tsx +17 -6
  24. package/src/components/molecules/send-bubble/send-text-bubble.test.js +71 -0
  25. package/src/components/molecules/tag/tag.component.d.ts +3 -2
  26. package/src/components/organisms/day-select/day-select.component.tsx +5 -1
  27. package/src/components/organisms/text-bubble/__snapshots__/text-bubble.test.js.snap +21 -0
  28. package/src/components/organisms/text-bubble/text-bubble.component.d.ts +5 -4
  29. package/src/components/organisms/text-bubble/text-bubble.component.tsx +15 -5
  30. package/src/components/organisms/text-bubble/text-bubble.preview.tsx +6 -1
  31. package/src/components/organisms/text-bubble/text-bubble.styles.d.ts +30 -44
  32. package/src/components/organisms/text-bubble/text-bubble.styles.js +2 -0
  33. package/src/components/organisms/text-bubble/text-bubble.test.js +7 -0
package/App.tsx CHANGED
@@ -69,6 +69,7 @@ import {BackgroundGradientPreview} from './src/components/atoms/background-gradi
69
69
  import {PersonInfoCardPreview} from './src/components/organisms/person-info-card/person-info-card.preview';
70
70
  import {TimePickerPreview} from './src/components/molecules/time-picker/time-picker.preview';
71
71
  import {PopOverActionPreview} from './src/components/templates/popover-action/popover-action.preview';
72
+ import {QuickMessagePreview} from './src/components/atoms/quick-message/quick-message.preview';
72
73
 
73
74
  const Stack = createNativeStackNavigator();
74
75
 
@@ -221,6 +222,10 @@ const HomeScreen = ({navigation}: {navigation: any}) => {
221
222
  title="Quick Filter"
222
223
  onPress={() => navigation.push('quick-filter')}
223
224
  />
225
+ <ReactBtn
226
+ title="Quick Message"
227
+ onPress={() => navigation.push('quick-message')}
228
+ />
224
229
  <ReactBtn
225
230
  title="Search Input"
226
231
  onPress={() => navigation.push('search')}
@@ -403,6 +408,9 @@ function App() {
403
408
  <Stack.Screen name="quick-filter">
404
409
  {() => <QuickFilterPreview />}
405
410
  </Stack.Screen>
411
+ <Stack.Screen name="quick-message">
412
+ {() => <QuickMessagePreview />}
413
+ </Stack.Screen>
406
414
  <Stack.Screen name="search">{() => <SearchPreview />}</Stack.Screen>
407
415
  <Stack.Screen name="select-link">
408
416
  {() => <SelectLinkPreview />}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tactics/toddle-styleguide",
3
- "version": "1.2.6",
3
+ "version": "1.2.7",
4
4
  "main": "index.tsx",
5
5
  "types": "index.d.ts",
6
6
  "prepublish": "tsc",
@@ -1885,7 +1885,7 @@ exports[`Test for the calendar component renders a calendar where you can select
1885
1885
  }
1886
1886
  >
1887
1887
  <View
1888
- accessibilityLabel="today Donderdag 13 Juli 2023 "
1888
+ accessibilityLabel=" Donderdag 13 Juli 2023 "
1889
1889
  accessibilityRole="button"
1890
1890
  accessibilityState={
1891
1891
  {
@@ -1917,10 +1917,6 @@ exports[`Test for the calendar component renders a calendar where you can select
1917
1917
  style={
1918
1918
  {
1919
1919
  "alignItems": "center",
1920
- "borderColor": "#7B93DB",
1921
- "borderRadius": 21,
1922
- "borderStyle": "solid",
1923
- "borderWidth": 1,
1924
1920
  "height": 42,
1925
1921
  "justifyContent": "center",
1926
1922
  "opacity": 1,
@@ -1940,9 +1936,6 @@ exports[`Test for the calendar component renders a calendar where you can select
1940
1936
  "lineHeight": 22.4,
1941
1937
  "marginTop": 4,
1942
1938
  },
1943
- {
1944
- "color": "#7B93DB",
1945
- },
1946
1939
  ]
1947
1940
  }
1948
1941
  >
@@ -2307,7 +2300,7 @@ exports[`Test for the calendar component renders a calendar where you can select
2307
2300
  }
2308
2301
  >
2309
2302
  <View
2310
- accessibilityLabel=" Dinsdag 18 Juli 2023 "
2303
+ accessibilityLabel="today Dinsdag 18 Juli 2023 "
2311
2304
  accessibilityRole="button"
2312
2305
  accessibilityState={
2313
2306
  {
@@ -2339,6 +2332,10 @@ exports[`Test for the calendar component renders a calendar where you can select
2339
2332
  style={
2340
2333
  {
2341
2334
  "alignItems": "center",
2335
+ "borderColor": "#7B93DB",
2336
+ "borderRadius": 21,
2337
+ "borderStyle": "solid",
2338
+ "borderWidth": 1,
2342
2339
  "height": 42,
2343
2340
  "justifyContent": "center",
2344
2341
  "opacity": 1,
@@ -2358,6 +2355,9 @@ exports[`Test for the calendar component renders a calendar where you can select
2358
2355
  "lineHeight": 22.4,
2359
2356
  "marginTop": 4,
2360
2357
  },
2358
+ {
2359
+ "color": "#7B93DB",
2360
+ },
2361
2361
  ]
2362
2362
  }
2363
2363
  >
@@ -5865,8 +5865,7 @@ exports[`Test for the calendar component renders a calendar where you can select
5865
5865
  }
5866
5866
  >
5867
5867
  <View
5868
- accessibilityLabel="today Donderdag 13 Juli 2023 "
5869
- accessibilityRole="button"
5868
+ accessibilityLabel=" Donderdag 13 Juli 2023 "
5870
5869
  accessibilityState={
5871
5870
  {
5872
5871
  "busy": undefined,
@@ -5897,10 +5896,6 @@ exports[`Test for the calendar component renders a calendar where you can select
5897
5896
  style={
5898
5897
  {
5899
5898
  "alignItems": "center",
5900
- "borderColor": "#7B93DB",
5901
- "borderRadius": 21,
5902
- "borderStyle": "solid",
5903
- "borderWidth": 1,
5904
5899
  "height": 42,
5905
5900
  "justifyContent": "center",
5906
5901
  "opacity": 1,
@@ -5921,7 +5916,7 @@ exports[`Test for the calendar component renders a calendar where you can select
5921
5916
  "marginTop": 4,
5922
5917
  },
5923
5918
  {
5924
- "color": "#7B93DB",
5919
+ "color": "#9AA5B1",
5925
5920
  },
5926
5921
  ]
5927
5922
  }
@@ -6295,7 +6290,8 @@ exports[`Test for the calendar component renders a calendar where you can select
6295
6290
  }
6296
6291
  >
6297
6292
  <View
6298
- accessibilityLabel=" Dinsdag 18 Juli 2023 "
6293
+ accessibilityLabel="today Dinsdag 18 Juli 2023 "
6294
+ accessibilityRole="button"
6299
6295
  accessibilityState={
6300
6296
  {
6301
6297
  "busy": undefined,
@@ -6326,6 +6322,10 @@ exports[`Test for the calendar component renders a calendar where you can select
6326
6322
  style={
6327
6323
  {
6328
6324
  "alignItems": "center",
6325
+ "borderColor": "#7B93DB",
6326
+ "borderRadius": 21,
6327
+ "borderStyle": "solid",
6328
+ "borderWidth": 1,
6329
6329
  "height": 42,
6330
6330
  "justifyContent": "center",
6331
6331
  "opacity": 1,
@@ -6346,7 +6346,7 @@ exports[`Test for the calendar component renders a calendar where you can select
6346
6346
  "marginTop": 4,
6347
6347
  },
6348
6348
  {
6349
- "color": "#9AA5B1",
6349
+ "color": "#7B93DB",
6350
6350
  },
6351
6351
  ]
6352
6352
  }
@@ -0,0 +1,72 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`QuickMessage should render correctly 1`] = `
4
+ <View
5
+ accessibilityState={
6
+ {
7
+ "busy": undefined,
8
+ "checked": undefined,
9
+ "disabled": undefined,
10
+ "expanded": undefined,
11
+ "selected": undefined,
12
+ }
13
+ }
14
+ accessibilityValue={
15
+ {
16
+ "max": undefined,
17
+ "min": undefined,
18
+ "now": undefined,
19
+ "text": undefined,
20
+ }
21
+ }
22
+ accessible={true}
23
+ collapsable={false}
24
+ focusable={true}
25
+ onBlur={[Function]}
26
+ onClick={[Function]}
27
+ onFocus={[Function]}
28
+ onResponderGrant={[Function]}
29
+ onResponderMove={[Function]}
30
+ onResponderRelease={[Function]}
31
+ onResponderTerminate={[Function]}
32
+ onResponderTerminationRequest={[Function]}
33
+ onStartShouldSetResponder={[Function]}
34
+ style={
35
+ {
36
+ "backgroundColor": "#515F6C",
37
+ "borderBottomLeftRadius": 8,
38
+ "borderBottomRightRadius": 24,
39
+ "borderTopLeftRadius": 24,
40
+ "borderTopRightRadius": 24,
41
+ "paddingBottom": 24,
42
+ "paddingLeft": 24,
43
+ "paddingRight": 24,
44
+ "paddingTop": 24,
45
+ "width": "100%",
46
+ }
47
+ }
48
+ testID="quick-message-test"
49
+ >
50
+ <Text
51
+ style={
52
+ [
53
+ [
54
+ {
55
+ "fontFamily": "Montserrat",
56
+ "fontSize": 14,
57
+ "lineHeight": 22.4,
58
+ },
59
+ ],
60
+ {
61
+ "color": "#FFFFFF",
62
+ "textAlign": "center",
63
+ "width": "100%",
64
+ },
65
+ undefined,
66
+ ]
67
+ }
68
+ >
69
+ Test message
70
+ </Text>
71
+ </View>
72
+ `;
@@ -0,0 +1,7 @@
1
+ import { PressableProps } from 'react-native';
2
+ interface QuickMessageProps extends PressableProps {
3
+ message: string;
4
+ setMessage: (value: string) => void;
5
+ }
6
+ export declare const QuickMessage: ({ message, setMessage, ...props }: QuickMessageProps) => JSX.Element;
7
+ export {};
@@ -0,0 +1,32 @@
1
+ import {Pressable, PressableProps} from 'react-native';
2
+ import {Paragraph} from '../paragraph-components';
3
+ import {useContext} from 'react';
4
+ import {ThemeCtx} from '../../../context/theme.context';
5
+ import {Stylesheet} from './quick-message.styles';
6
+
7
+ interface QuickMessageProps extends PressableProps {
8
+ message: string;
9
+ setMessage: (value: string) => void;
10
+ }
11
+
12
+ export const QuickMessage = ({
13
+ message,
14
+ setMessage,
15
+ ...props
16
+ }: QuickMessageProps) => {
17
+ const context = useContext(ThemeCtx);
18
+ const styles = Stylesheet(context);
19
+
20
+ return (
21
+ <Pressable
22
+ onPress={() => setMessage(message)}
23
+ {...props}
24
+ style={styles.container}
25
+ testID={'quick-message-test'}
26
+ >
27
+ <Paragraph textAlign={'center'} textColor={context.colors.ui.white}>
28
+ {message}
29
+ </Paragraph>
30
+ </Pressable>
31
+ );
32
+ };
@@ -0,0 +1 @@
1
+ export declare const QuickMessagePreview: () => JSX.Element;
@@ -0,0 +1,33 @@
1
+ import {Text, View} from 'react-native';
2
+ import {QuickMessage} from './quick-message.component';
3
+ import {useState} from 'react';
4
+
5
+ export const QuickMessagePreview = () => {
6
+ const [message, setMessage] = useState<string>('');
7
+ return (
8
+ <View
9
+ style={{
10
+ width: '100%',
11
+ height: '100%',
12
+ alignItems: 'center',
13
+ justifyContent: 'center',
14
+ gap: 32,
15
+ padding: 32,
16
+ }}
17
+ >
18
+ <QuickMessage message={'Test message'} setMessage={setMessage} />
19
+ <QuickMessage
20
+ message={'Option message number 2'}
21
+ setMessage={setMessage}
22
+ />
23
+ <QuickMessage
24
+ message={
25
+ 'Aan het spelen met mijn vriendjes en vriendinnetjes in de speelhoek'
26
+ }
27
+ setMessage={setMessage}
28
+ />
29
+
30
+ <Text style={{textAlign: 'center'}}>Pressed message: {message}</Text>
31
+ </View>
32
+ );
33
+ };
@@ -0,0 +1,14 @@
1
+ export function Stylesheet(context: any): {
2
+ container: {
3
+ width: string;
4
+ backgroundColor: any;
5
+ paddingTop: number;
6
+ paddingBottom: number;
7
+ paddingRight: number;
8
+ paddingLeft: number;
9
+ borderBottomLeftRadius: number;
10
+ borderTopLeftRadius: number;
11
+ borderTopRightRadius: number;
12
+ borderBottomRightRadius: number;
13
+ };
14
+ };
@@ -0,0 +1,18 @@
1
+ import {StyleSheet} from 'react-native';
2
+ import {Scale} from '../../../theme/scale/index';
3
+
4
+ export const Stylesheet = (context) =>
5
+ StyleSheet.create({
6
+ container: {
7
+ width: '100%',
8
+ backgroundColor: context.colors.ui.darkgrey,
9
+ paddingTop: Scale.l,
10
+ paddingBottom: Scale.l,
11
+ paddingRight: Scale.l,
12
+ paddingLeft: Scale.l,
13
+ borderBottomLeftRadius: Scale.xs,
14
+ borderTopLeftRadius: Scale.l,
15
+ borderTopRightRadius: Scale.l,
16
+ borderBottomRightRadius: Scale.l,
17
+ },
18
+ });
@@ -0,0 +1,26 @@
1
+ import React from 'react';
2
+ import {render, fireEvent} from '@testing-library/react-native';
3
+ import {QuickMessage} from './quick-message.component';
4
+
5
+ describe('QuickMessage', () => {
6
+ it('should render correctly', () => {
7
+ const {toJSON} = render(
8
+ <QuickMessage message="Test message" setMessage={() => {}} />
9
+ );
10
+ expect(toJSON()).toMatchSnapshot();
11
+ });
12
+ });
13
+
14
+ describe('QuickMessage', () => {
15
+ it('should set the message when pressed', () => {
16
+ const setMessageMock = jest.fn();
17
+ const {getByTestId} = render(
18
+ <QuickMessage message="Test message" setMessage={setMessageMock} />
19
+ );
20
+
21
+ const pressable = getByTestId('quick-message-test');
22
+ fireEvent.press(pressable);
23
+
24
+ expect(setMessageMock).toHaveBeenCalledWith('Test message');
25
+ });
26
+ });
@@ -429,6 +429,78 @@ exports[`test button component should render a button component with a solid ico
429
429
  </View>
430
430
  `;
431
431
 
432
+ exports[`test button component should render a light button component 1`] = `
433
+ <View
434
+ accessibilityState={
435
+ {
436
+ "busy": undefined,
437
+ "checked": undefined,
438
+ "disabled": undefined,
439
+ "expanded": undefined,
440
+ "selected": undefined,
441
+ }
442
+ }
443
+ accessibilityValue={
444
+ {
445
+ "max": undefined,
446
+ "min": undefined,
447
+ "now": undefined,
448
+ "text": undefined,
449
+ }
450
+ }
451
+ accessible={true}
452
+ collapsable={false}
453
+ focusable={true}
454
+ onBlur={[Function]}
455
+ onClick={[Function]}
456
+ onFocus={[Function]}
457
+ onResponderGrant={[Function]}
458
+ onResponderMove={[Function]}
459
+ onResponderRelease={[Function]}
460
+ onResponderTerminate={[Function]}
461
+ onResponderTerminationRequest={[Function]}
462
+ onStartShouldSetResponder={[Function]}
463
+ >
464
+ <View
465
+ style={
466
+ {
467
+ "alignItems": "center",
468
+ "backgroundColor": "#FFFFFF",
469
+ "borderRadius": 50,
470
+ "flexDirection": "row",
471
+ "justifyContent": "center",
472
+ "paddingHorizontal": 24,
473
+ "paddingVertical": 12,
474
+ }
475
+ }
476
+ >
477
+ <View>
478
+ <Text
479
+ style={
480
+ [
481
+ [
482
+ {
483
+ "fontFamily": "SourceSansPro",
484
+ "fontSize": 16,
485
+ "lineHeight": 22.4,
486
+ },
487
+ ],
488
+ {
489
+ "color": "#515F6C",
490
+ "textAlign": "center",
491
+ "width": "100%",
492
+ },
493
+ undefined,
494
+ ]
495
+ }
496
+ >
497
+ Light button
498
+ </Text>
499
+ </View>
500
+ </View>
501
+ </View>
502
+ `;
503
+
432
504
  exports[`test button component should render a success button component 1`] = `
433
505
  <View
434
506
  accessibilityState={
@@ -1,6 +1,6 @@
1
1
  import { PressableProps } from 'react-native';
2
2
  import { IconNameType, IconStyleType } from '../../../types/icontype.type';
3
- type ButtonType = 'regular' | 'error' | 'success';
3
+ type ButtonType = 'regular' | 'error' | 'success' | 'light';
4
4
  interface ButtonProps extends PressableProps {
5
5
  label: string;
6
6
  icon?: boolean;
@@ -8,7 +8,7 @@ import {Heading4} from '../../atoms/heading-components';
8
8
  import {IconNameType, IconStyleType} from '../../../types/icontype.type';
9
9
  import {Icon} from '../../../icons/index';
10
10
 
11
- type ButtonType = 'regular' | 'error' | 'success';
11
+ type ButtonType = 'regular' | 'error' | 'success' | 'light';
12
12
 
13
13
  interface ButtonProps extends PressableProps {
14
14
  label: string;
@@ -33,12 +33,17 @@ const Button = ({
33
33
  const context = useContext(ThemeCtx);
34
34
 
35
35
  let buttonColor;
36
+ let textColor = context.colors.ui.white;
36
37
  if (type === 'error') {
37
38
  buttonColor = context.colors.ui.error.dark;
38
39
  } else if (type === 'success') {
39
40
  buttonColor = context.colors.ui.success.dark;
41
+ } else if (type === 'light') {
42
+ buttonColor = context.colors.ui.white;
43
+ textColor = context.colors.ui.darkgrey;
40
44
  } else {
41
45
  buttonColor = context.colors.main['0'];
46
+ textColor = context.colors.main['9'];
42
47
  }
43
48
 
44
49
  const styles = Stylesheet(context, disabled, buttonColor);
@@ -51,13 +56,7 @@ const Button = ({
51
56
  <Icon
52
57
  style={iconStyle}
53
58
  name={iconName}
54
- color={
55
- disabled
56
- ? context.colors.ui.darkgrey
57
- : type === 'regular'
58
- ? context.colors.main['9']
59
- : context.colors.ui.white
60
- }
59
+ color={disabled ? context.colors.ui.darkgrey : textColor}
61
60
  size={iconSize}
62
61
  />
63
62
  </View>
@@ -65,13 +64,7 @@ const Button = ({
65
64
  <View>
66
65
  <Heading4
67
66
  textAlign={'center'}
68
- textColor={
69
- disabled
70
- ? context.colors.ui.darkgrey
71
- : type === 'regular'
72
- ? context.colors.main['9']
73
- : context.colors.ui.white
74
- }
67
+ textColor={disabled ? context.colors.ui.darkgrey : textColor}
75
68
  >
76
69
  {label}
77
70
  </Heading4>
@@ -22,6 +22,11 @@ export const ButtonPreview = ({}: {}) => {
22
22
  type={'success'}
23
23
  onPress={() => console.log('clicked')}
24
24
  />
25
+ <Button
26
+ label="Light button"
27
+ type={'light'}
28
+ onPress={() => console.log('clicked')}
29
+ />
25
30
  <Button
26
31
  label="Icon button"
27
32
  icon={true}
@@ -19,6 +19,12 @@ describe('test button component', () => {
19
19
  .toJSON();
20
20
  expect(tree).toMatchSnapshot();
21
21
  });
22
+ it('should render a light button component', function () {
23
+ const tree = render
24
+ .create(<Button type={'light'} label="Light button" />)
25
+ .toJSON();
26
+ expect(tree).toMatchSnapshot();
27
+ });
22
28
  it('should render a button component that is disabled', () => {
23
29
  const tree = render
24
30
  .create(<Button label="Button without icon" disabled={true} />)
@@ -174,6 +174,7 @@ exports[`Failed text bubble test shows a failed to send text bubble that is swip
174
174
  onResponderTerminate={[Function]}
175
175
  onResponderTerminationRequest={[Function]}
176
176
  onStartShouldSetResponder={[Function]}
177
+ testID="refresh-button"
177
178
  >
178
179
  <RNSVGSvgView
179
180
  align="xMidYMid"
@@ -274,6 +275,7 @@ exports[`Failed text bubble test shows a failed to send text bubble that is swip
274
275
  onResponderTerminate={[Function]}
275
276
  onResponderTerminationRequest={[Function]}
276
277
  onStartShouldSetResponder={[Function]}
278
+ testID="delete-button"
277
279
  >
278
280
  <RNSVGSvgView
279
281
  align="xMidYMid"
@@ -1,7 +1,8 @@
1
1
  type FailedBubbleProps = {
2
+ id: string;
2
3
  text: string;
3
- onPressRefresh: () => void;
4
- onPressDelete: () => void;
4
+ onPressRefresh: (id: string) => void;
5
+ onPressDelete: (id: string) => void;
5
6
  };
6
- declare const FailedTextBubble: ({ text, onPressRefresh, onPressDelete, }: FailedBubbleProps) => JSX.Element;
7
+ declare const FailedTextBubble: ({ id, text, onPressRefresh, onPressDelete, }: FailedBubbleProps) => JSX.Element;
7
8
  export { FailedTextBubble };
@@ -10,12 +10,14 @@ import {GestureHandlerRootView, Swipeable} from 'react-native-gesture-handler';
10
10
  import {SmallText} from '../../atoms/paragraph-components';
11
11
 
12
12
  type FailedBubbleProps = {
13
+ id: string;
13
14
  text: string;
14
- onPressRefresh: () => void;
15
- onPressDelete: () => void;
15
+ onPressRefresh: (id: string) => void;
16
+ onPressDelete: (id: string) => void;
16
17
  };
17
18
 
18
19
  const FailedTextBubble = ({
20
+ id,
19
21
  text,
20
22
  onPressRefresh,
21
23
  onPressDelete,
@@ -36,7 +38,7 @@ const FailedTextBubble = ({
36
38
  return (
37
39
  <View style={styles.swipedRow}>
38
40
  <Animated.View style={[styles.swipedIcon, {opacity}]}>
39
- <Pressable onPress={onPressRefresh}>
41
+ <Pressable onPress={() => onPressRefresh(id)} testID="refresh-button">
40
42
  <Icon
41
43
  style={'regular'}
42
44
  name={'refresh'}
@@ -45,7 +47,7 @@ const FailedTextBubble = ({
45
47
  </Pressable>
46
48
  </Animated.View>
47
49
  <Animated.View style={[styles.swipedIcon, {opacity}]}>
48
- <Pressable onPress={onPressDelete}>
50
+ <Pressable onPress={() => onPressDelete(id)} testID="delete-button">
49
51
  <Icon
50
52
  style={'regular'}
51
53
  name={'trash'}
@@ -1,12 +1,14 @@
1
1
  import React from 'react';
2
2
  import renderer from 'react-test-renderer';
3
3
  import {FailedTextBubble} from './failed-bubble.component';
4
+ import {render, fireEvent} from '@testing-library/react-native';
4
5
 
5
6
  describe('Failed text bubble test', () => {
6
7
  it('shows a failed to send text bubble that is swipeable with refresh and trash icon, which if we press them we can resend or delete the message', () => {
7
8
  const tree = renderer
8
9
  .create(
9
10
  <FailedTextBubble
11
+ id={'1'}
10
12
  text={'Testing our failed bubble'}
11
13
  onPressRefresh={() => alert('pressed resend')}
12
14
  onPressDelete={() => alert('delete the message')}
@@ -17,3 +19,57 @@ describe('Failed text bubble test', () => {
17
19
  expect(tree).toMatchSnapshot();
18
20
  });
19
21
  });
22
+
23
+ describe('FailedTextBubble', () => {
24
+ const mockId = '123';
25
+ const mockText = 'Failed message';
26
+ const mockOnPressRefresh = jest.fn();
27
+ const mockOnPressDelete = jest.fn();
28
+
29
+ afterEach(() => {
30
+ jest.clearAllMocks();
31
+ });
32
+
33
+ it('should render the component correctly', () => {
34
+ const {getByText} = render(
35
+ <FailedTextBubble
36
+ id={mockId}
37
+ text={mockText}
38
+ onPressRefresh={mockOnPressRefresh}
39
+ onPressDelete={mockOnPressDelete}
40
+ />
41
+ );
42
+
43
+ expect(getByText(mockText)).toBeDefined();
44
+ });
45
+
46
+ it('should call onPressRefresh when the refresh button is pressed', () => {
47
+ const {getByTestId} = render(
48
+ <FailedTextBubble
49
+ id={mockId}
50
+ text={mockText}
51
+ onPressRefresh={mockOnPressRefresh}
52
+ onPressDelete={mockOnPressDelete}
53
+ />
54
+ );
55
+
56
+ fireEvent.press(getByTestId('refresh-button'));
57
+
58
+ expect(mockOnPressRefresh).toHaveBeenCalledWith(mockId);
59
+ });
60
+
61
+ it('should call onPressDelete when the delete button is pressed', () => {
62
+ const {getByTestId} = render(
63
+ <FailedTextBubble
64
+ id={mockId}
65
+ text={mockText}
66
+ onPressRefresh={mockOnPressRefresh}
67
+ onPressDelete={mockOnPressDelete}
68
+ />
69
+ );
70
+
71
+ fireEvent.press(getByTestId('delete-button'));
72
+
73
+ expect(mockOnPressDelete).toHaveBeenCalledWith(mockId);
74
+ });
75
+ });