@planningcenter/chat-react-native 3.1.0 → 3.2.0-rc.0

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 (48) hide show
  1. package/build/navigation/index.d.ts +1 -8
  2. package/build/navigation/index.d.ts.map +1 -1
  3. package/build/screens/conversation_filters/components/conversation_filters.d.ts +3 -0
  4. package/build/screens/conversation_filters/components/conversation_filters.d.ts.map +1 -0
  5. package/build/screens/conversation_filters/components/conversation_filters.js +173 -0
  6. package/build/screens/conversation_filters/components/conversation_filters.js.map +1 -0
  7. package/build/screens/conversation_filters/components/rows.d.ts +31 -0
  8. package/build/screens/conversation_filters/components/rows.d.ts.map +1 -0
  9. package/build/screens/conversation_filters/components/rows.js +111 -0
  10. package/build/screens/conversation_filters/components/rows.js.map +1 -0
  11. package/build/screens/conversation_filters/context/conversation_filter_context.d.ts +23 -0
  12. package/build/screens/conversation_filters/context/conversation_filter_context.d.ts.map +1 -0
  13. package/build/screens/conversation_filters/context/conversation_filter_context.js +51 -0
  14. package/build/screens/conversation_filters/context/conversation_filter_context.js.map +1 -0
  15. package/build/screens/conversation_filters/filter_types.d.ts +7 -0
  16. package/build/screens/conversation_filters/filter_types.d.ts.map +1 -0
  17. package/build/screens/conversation_filters/filter_types.js +8 -0
  18. package/build/screens/conversation_filters/filter_types.js.map +1 -0
  19. package/build/screens/conversation_filters/group_filters.d.ts +6 -0
  20. package/build/screens/conversation_filters/group_filters.d.ts.map +1 -0
  21. package/build/screens/conversation_filters/group_filters.js +15 -0
  22. package/build/screens/conversation_filters/group_filters.js.map +1 -0
  23. package/build/screens/conversation_filters/hooks/filters.d.ts +415 -0
  24. package/build/screens/conversation_filters/hooks/filters.d.ts.map +1 -0
  25. package/build/screens/conversation_filters/hooks/filters.js +41 -0
  26. package/build/screens/conversation_filters/hooks/filters.js.map +1 -0
  27. package/build/screens/conversation_filters/screen_props.d.ts +13 -0
  28. package/build/screens/conversation_filters/screen_props.d.ts.map +1 -0
  29. package/build/screens/conversation_filters/screen_props.js +2 -0
  30. package/build/screens/conversation_filters/screen_props.js.map +1 -0
  31. package/build/screens/conversation_filters/team_filters.d.ts +6 -0
  32. package/build/screens/conversation_filters/team_filters.d.ts.map +1 -0
  33. package/build/screens/conversation_filters/team_filters.js +15 -0
  34. package/build/screens/conversation_filters/team_filters.js.map +1 -0
  35. package/build/screens/conversation_filters_screen.d.ts +2 -9
  36. package/build/screens/conversation_filters_screen.d.ts.map +1 -1
  37. package/build/screens/conversation_filters_screen.js +81 -302
  38. package/build/screens/conversation_filters_screen.js.map +1 -1
  39. package/package.json +2 -2
  40. package/src/screens/conversation_filters/components/conversation_filters.tsx +233 -0
  41. package/src/screens/conversation_filters/components/rows.tsx +164 -0
  42. package/src/screens/conversation_filters/context/conversation_filter_context.tsx +65 -0
  43. package/src/screens/conversation_filters/filter_types.ts +6 -0
  44. package/src/screens/conversation_filters/group_filters.tsx +31 -0
  45. package/src/screens/conversation_filters/hooks/filters.ts +68 -0
  46. package/src/screens/conversation_filters/screen_props.ts +15 -0
  47. package/src/screens/conversation_filters/team_filters.tsx +31 -0
  48. package/src/screens/conversation_filters_screen.tsx +93 -429
@@ -94,14 +94,7 @@ export declare const ChatStack: import("@react-navigation/native").TypedNavigato
94
94
  };
95
95
  };
96
96
  readonly ConversationFilters: {
97
- readonly screen: ({}: {
98
- route: {
99
- params: {
100
- chat_group_graph_id?: import("../types/resources/group_resource").GraphId;
101
- group_source_app_name?: string;
102
- };
103
- };
104
- }) => React.JSX.Element;
97
+ readonly screen: (_props: import("../screens/conversation_filters/screen_props").ConversationFiltersScreenProps) => React.JSX.Element;
105
98
  readonly options: import("@react-navigation/native-stack").NativeStackNavigationOptions;
106
99
  };
107
100
  readonly Conversation: {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/navigation/index.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAC1D,OAAO,EAEL,2BAA2B,EAC5B,MAAM,gCAAgC,CAAA;AACvC,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,yBAAyB,EAAE,MAAM,wCAAwC,CAAA;AAClF,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAA;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAA;AAOrE,OAAO,EACL,oBAAoB,EAErB,MAAM,mCAAmC,CAAA;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAC/C,OAAO,EAAE,eAAe,EAA0B,MAAM,6BAA6B,CAAA;AAErF,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAM7C,eAAO,MAAM,uBAAuB;;;;;;;;;uOAnBpC,mBAAkB;;;;;;;;;;;;;;;;;;;uBA4Hy1c,gBAAiB,KAAK;;;qCA9Fp2c,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;EAmBtD,CAAA;AAEF,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;uBAyEq1c,gBAAiB,KAAK;;;qCA/Dp2c,2BAA2B;;;;;;;;;;;;;;;;;;;;;;uBA+Dmzc,gBAAiB,KAAK;;;;qCA1Cp2c,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mDA0Co0c,KAAK;;;iDA9Fp2c,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqFtD,CAAA;AAEF,KAAK,kBAAkB,GAAG,eAAe,CAAC,OAAO,SAAS,CAAC,CAAA;AAE3D,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,eAAe,CAAC;QACxB,UAAU,aAAc,SAAQ,kBAAkB;SAAG;KACtD;CACF"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/navigation/index.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAC1D,OAAO,EAEL,2BAA2B,EAC5B,MAAM,gCAAgC,CAAA;AACvC,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,yBAAyB,EAAE,MAAM,wCAAwC,CAAA;AAClF,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAA;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAA;AAOrE,OAAO,EACL,oBAAoB,EAErB,MAAM,mCAAmC,CAAA;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAC/C,OAAO,EAAE,eAAe,EAA0B,MAAM,6BAA6B,CAAA;AAErF,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAM7C,eAAO,MAAM,uBAAuB;;;;;;;;;uOAnBpC,mBAAkB;;;;;;;;;;;;;;;;;;;uBA4Hy1c,gBAAiB,KAAK;;;qCA9Fp2c,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;EAmBtD,CAAA;AAEF,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;uBAyEq1c,gBAAiB,KAAK;;;qCA/Dp2c,2BAA2B;;;;;;;;;;;;;;;uBA+Dmzc,gBAAiB,KAAK;;;;qCA1Cp2c,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mDA0Co0c,KAAK;;;iDA9Fp2c,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqFtD,CAAA;AAEF,KAAK,kBAAkB,GAAG,eAAe,CAAC,OAAO,SAAS,CAAC,CAAA;AAE3D,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,eAAe,CAAC;QACxB,UAAU,aAAc,SAAQ,kBAAkB;SAAG;KACtD;CACF"}
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ export declare const ConversationFilters: () => React.JSX.Element;
3
+ //# sourceMappingURL=conversation_filters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation_filters.d.ts","sourceRoot":"","sources":["../../../../src/screens/conversation_filters/components/conversation_filters.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAA;AAmDlD,eAAO,MAAM,mBAAmB,yBAgH/B,CAAA"}
@@ -0,0 +1,173 @@
1
+ import React, { useContext, useMemo } from 'react';
2
+ import { FlatList, StyleSheet, View } from 'react-native';
3
+ import { useSafeAreaInsets } from 'react-native-safe-area-context';
4
+ import { Heading } from '../../../components';
5
+ import { useTheme } from '../../../hooks';
6
+ import { FilterContext } from '../context/conversation_filter_context';
7
+ import { FilterTypes } from '../filter_types';
8
+ import { useGroupsToFilter, useTeamsToFilter } from '../hooks/filters';
9
+ import { FilterRow, GroupRow, TeamRow, ViewMore, } from './rows';
10
+ // =========================================
11
+ // ====== Factory Constants & Types ========
12
+ // =========================================
13
+ var SectionTypes;
14
+ (function (SectionTypes) {
15
+ SectionTypes[SectionTypes["filter"] = 0] = "filter";
16
+ SectionTypes[SectionTypes["groups"] = 1] = "groups";
17
+ SectionTypes[SectionTypes["header"] = 2] = "header";
18
+ SectionTypes[SectionTypes["hidden"] = 3] = "hidden";
19
+ SectionTypes[SectionTypes["more"] = 4] = "more";
20
+ SectionTypes[SectionTypes["teams"] = 5] = "teams";
21
+ })(SectionTypes || (SectionTypes = {}));
22
+ // =================================
23
+ // ====== Components ===============
24
+ // =================================
25
+ export const ConversationFilters = () => {
26
+ const styles = useStyles();
27
+ const { setScrollOffset, params } = useContext(FilterContext);
28
+ const { chat_group_graph_id, group_source_app_name = '' } = params;
29
+ const activeFilter = useMemo(() => {
30
+ if (chat_group_graph_id) {
31
+ return FilterTypes.More;
32
+ }
33
+ else if (/groups/i.test(group_source_app_name)) {
34
+ return FilterTypes.Groups;
35
+ }
36
+ else if (/services/i.test(group_source_app_name)) {
37
+ return FilterTypes.Teams;
38
+ }
39
+ return FilterTypes.All;
40
+ }, [chat_group_graph_id, group_source_app_name]);
41
+ const { groups = [] } = useGroupsToFilter();
42
+ const { teams = [] } = useTeamsToFilter();
43
+ const activeGroupId = chat_group_graph_id;
44
+ const isExactGroupFilter = activeFilter === FilterTypes.More;
45
+ const teamItems = teams.map(team => ({
46
+ type: SectionTypes.teams,
47
+ data: {
48
+ team,
49
+ isActive: isExactGroupFilter && team.id.toString() === activeGroupId,
50
+ },
51
+ }));
52
+ const groupItems = groups.map(group => ({
53
+ type: SectionTypes.groups,
54
+ data: {
55
+ group,
56
+ isActive: isExactGroupFilter && group?.id.toString() === activeGroupId,
57
+ },
58
+ }));
59
+ const groupItemData = selectActiveWithFirst(5)(groupItems);
60
+ const teamItemData = selectActiveWithFirst(5)(teamItems);
61
+ const hideAppFilters = groupItems.length < 1 || teamItems.length < 1;
62
+ const listData = [
63
+ {
64
+ type: hideAppFilters ? SectionTypes.hidden : SectionTypes.header,
65
+ data: { title: 'General Filters' },
66
+ },
67
+ {
68
+ type: hideAppFilters ? SectionTypes.hidden : SectionTypes.filter,
69
+ data: { filter: FilterTypes.All, isActive: activeFilter === FilterTypes.All },
70
+ },
71
+ {
72
+ type: hideAppFilters ? SectionTypes.hidden : SectionTypes.filter,
73
+ data: {
74
+ filter: FilterTypes.Groups,
75
+ group_source_app_name: 'groups',
76
+ isActive: activeFilter === FilterTypes.Groups,
77
+ },
78
+ },
79
+ {
80
+ type: hideAppFilters ? SectionTypes.hidden : SectionTypes.filter,
81
+ data: {
82
+ filter: FilterTypes.Teams,
83
+ group_source_app_name: 'services',
84
+ isActive: activeFilter === FilterTypes.Teams,
85
+ },
86
+ },
87
+ {
88
+ type: groupItems.length ? SectionTypes.header : SectionTypes.hidden,
89
+ data: { title: 'Groups' },
90
+ },
91
+ ...groupItemData,
92
+ {
93
+ type: groupItems.length > 5 ? SectionTypes.more : SectionTypes.hidden,
94
+ data: { routeName: 'GroupFilters' },
95
+ },
96
+ {
97
+ type: teamItems.length ? SectionTypes.header : SectionTypes.hidden,
98
+ data: { title: 'Teams' },
99
+ },
100
+ ...teamItemData,
101
+ {
102
+ type: teamItems.length > 5 ? SectionTypes.more : SectionTypes.hidden,
103
+ data: { routeName: 'TeamFilters' },
104
+ },
105
+ ];
106
+ return (<FlatList data={listData} contentContainerStyle={styles.flatlistContainer} nestedScrollEnabled={true} onScroll={e => setScrollOffset(e.nativeEvent.contentOffset.y)} renderItem={({ item }) => {
107
+ switch (item.type) {
108
+ case SectionTypes.header:
109
+ return <Header {...item.data}/>;
110
+ case SectionTypes.filter:
111
+ return <FilterRow {...item.data}/>;
112
+ case SectionTypes.groups:
113
+ return <GroupRow {...item.data}/>;
114
+ case SectionTypes.teams:
115
+ return <TeamRow {...item.data}/>;
116
+ case SectionTypes.more:
117
+ return <ViewMore {...item.data}/>;
118
+ default:
119
+ return null;
120
+ }
121
+ }}/>);
122
+ };
123
+ const useStyles = () => {
124
+ const { bottom } = useSafeAreaInsets();
125
+ const theme = useTheme();
126
+ return StyleSheet.create({
127
+ flatlistContainer: {
128
+ paddingBottom: 64 + bottom,
129
+ },
130
+ section: {},
131
+ sectionHeader: {
132
+ flexDirection: 'row',
133
+ justifyContent: 'space-between',
134
+ paddingTop: 24,
135
+ paddingBottom: 8,
136
+ paddingHorizontal: 16,
137
+ },
138
+ selectTeamsButton: {},
139
+ filterBar: {
140
+ backgroundColor: theme.colors.fillColorNeutral100Inverted,
141
+ flexDirection: 'row',
142
+ justifyContent: 'space-between',
143
+ alignItems: 'center',
144
+ paddingHorizontal: 16,
145
+ paddingVertical: 16,
146
+ gap: 8,
147
+ },
148
+ filterBarScroll: {
149
+ elevation: 4,
150
+ boxShadow: '0px 4px 4px rgba(0, 0, 0, 0.1)',
151
+ },
152
+ filterBarActions: {
153
+ flexDirection: 'row',
154
+ gap: 8,
155
+ alignItems: 'center',
156
+ },
157
+ });
158
+ };
159
+ const Header = ({ title }) => {
160
+ const styles = useStyles();
161
+ return (<View style={styles.sectionHeader}>
162
+ <Heading variant="h3">{title}</Heading>
163
+ </View>);
164
+ };
165
+ const selectActiveWithFirst = (number) => (groups) => {
166
+ const activeGroupIndex = groups.findIndex(group => group.data.isActive);
167
+ const activeGroup = groups[activeGroupIndex];
168
+ if (!activeGroup || activeGroupIndex <= number) {
169
+ return groups.slice(0, number);
170
+ }
171
+ return [activeGroup, ...groups].slice(0, number);
172
+ };
173
+ //# sourceMappingURL=conversation_filters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation_filters.js","sourceRoot":"","sources":["../../../../src/screens/conversation_filters/components/conversation_filters.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useContext, useMemo } from 'react'\nimport { FlatList, RefreshControl, StyleSheet, View, ViewStyle } from 'react-native'\nimport { useSafeAreaInsets } from 'react-native-safe-area-context'\nimport { Heading } from '../../../components'\nimport { useTheme } from '../../../hooks'\nimport { FilterContext } from '../context/conversation_filter_context'\nimport { FilterTypes } from '../filter_types'\nimport { useGroupsToFilter, useTeamsToFilter } from '../hooks/filters'\nimport {\n FilterProps,\n FilterRow,\n GroupRow,\n GroupRowProps,\n TeamRow,\n TeamRowProps,\n ViewMore,\n ViewMoreRowProps,\n} from './rows'\n\n// =========================================\n// ====== Factory Constants & Types ========\n// =========================================\n\nenum SectionTypes {\n filter,\n groups,\n header,\n hidden,\n more,\n teams,\n}\n\ntype SectionListData = Array<\n | DataItem<FilterProps, SectionTypes.filter>\n | DataItem<GroupRowProps, SectionTypes.groups>\n | DataItem<HeaderProps, SectionTypes.header>\n | DataItem<any, SectionTypes.hidden>\n | DataItem<ViewMoreRowProps, SectionTypes.more>\n | DataItem<TeamRowProps, SectionTypes.teams>\n>\n\ninterface DataItem<T, TName extends SectionTypes> {\n type: TName\n data: T\n sectionStyle?: ViewStyle\n}\n\n// =================================\n// ====== Components ===============\n// =================================\n\nexport const ConversationFilters = () => {\n const styles = useStyles()\n const { setScrollOffset, params } = useContext(FilterContext)\n const { chat_group_graph_id, group_source_app_name = '' } = params\n\n const activeFilter: FilterTypes = useMemo(() => {\n if (chat_group_graph_id) {\n return FilterTypes.More\n } else if (/groups/i.test(group_source_app_name)) {\n return FilterTypes.Groups\n } else if (/services/i.test(group_source_app_name)) {\n return FilterTypes.Teams\n }\n\n return FilterTypes.All\n }, [chat_group_graph_id, group_source_app_name])\n\n const { groups = [] } = useGroupsToFilter()\n const { teams = [] } = useTeamsToFilter()\n\n const activeGroupId = chat_group_graph_id\n const isExactGroupFilter = activeFilter === FilterTypes.More\n\n const teamItems: DataItem<TeamRowProps, SectionTypes.teams>[] = teams.map(team => ({\n type: SectionTypes.teams,\n data: {\n team,\n isActive: isExactGroupFilter && team.id.toString() === activeGroupId,\n },\n }))\n\n const groupItems: DataItem<GroupRowProps, SectionTypes.groups>[] = groups.map(group => ({\n type: SectionTypes.groups,\n data: {\n group,\n isActive: isExactGroupFilter && group?.id.toString() === activeGroupId,\n },\n }))\n const groupItemData = selectActiveWithFirst(5)(groupItems)\n const teamItemData = selectActiveWithFirst(5)(teamItems)\n\n const hideAppFilters = groupItems.length < 1 || teamItems.length < 1\n\n const listData: SectionListData = [\n {\n type: hideAppFilters ? SectionTypes.hidden : SectionTypes.header,\n data: { title: 'General Filters' },\n },\n {\n type: hideAppFilters ? SectionTypes.hidden : SectionTypes.filter,\n data: { filter: FilterTypes.All, isActive: activeFilter === FilterTypes.All },\n },\n {\n type: hideAppFilters ? SectionTypes.hidden : SectionTypes.filter,\n data: {\n filter: FilterTypes.Groups,\n group_source_app_name: 'groups',\n isActive: activeFilter === FilterTypes.Groups,\n },\n },\n {\n type: hideAppFilters ? SectionTypes.hidden : SectionTypes.filter,\n data: {\n filter: FilterTypes.Teams,\n group_source_app_name: 'services',\n isActive: activeFilter === FilterTypes.Teams,\n },\n },\n {\n type: groupItems.length ? SectionTypes.header : SectionTypes.hidden,\n data: { title: 'Groups' },\n },\n ...groupItemData,\n {\n type: groupItems.length > 5 ? SectionTypes.more : SectionTypes.hidden,\n data: { routeName: 'GroupFilters' },\n },\n {\n type: teamItems.length ? SectionTypes.header : SectionTypes.hidden,\n data: { title: 'Teams' },\n },\n ...teamItemData,\n {\n type: teamItems.length > 5 ? SectionTypes.more : SectionTypes.hidden,\n data: { routeName: 'TeamFilters' },\n },\n ]\n\n return (\n <FlatList\n data={listData}\n contentContainerStyle={styles.flatlistContainer}\n nestedScrollEnabled={true}\n onScroll={e => setScrollOffset(e.nativeEvent.contentOffset.y)}\n renderItem={({ item }) => {\n switch (item.type) {\n case SectionTypes.header:\n return <Header {...item.data} />\n case SectionTypes.filter:\n return <FilterRow {...item.data} />\n case SectionTypes.groups:\n return <GroupRow {...item.data} />\n case SectionTypes.teams:\n return <TeamRow {...item.data} />\n case SectionTypes.more:\n return <ViewMore {...item.data} />\n default:\n return null\n }\n }}\n />\n )\n}\n\nconst useStyles = () => {\n const { bottom } = useSafeAreaInsets()\n const theme = useTheme()\n\n return StyleSheet.create({\n flatlistContainer: {\n paddingBottom: 64 + bottom,\n },\n section: {},\n sectionHeader: {\n flexDirection: 'row',\n justifyContent: 'space-between',\n paddingTop: 24,\n paddingBottom: 8,\n paddingHorizontal: 16,\n },\n selectTeamsButton: {},\n filterBar: {\n backgroundColor: theme.colors.fillColorNeutral100Inverted,\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n paddingHorizontal: 16,\n paddingVertical: 16,\n gap: 8,\n },\n filterBarScroll: {\n elevation: 4,\n boxShadow: '0px 4px 4px rgba(0, 0, 0, 0.1)',\n },\n filterBarActions: {\n flexDirection: 'row',\n gap: 8,\n alignItems: 'center',\n },\n })\n}\n\ntype HeaderProps = {\n title: string\n}\n\nconst Header = ({ title }: HeaderProps) => {\n const styles = useStyles()\n\n return (\n <View style={styles.sectionHeader}>\n <Heading variant=\"h3\">{title}</Heading>\n </View>\n )\n}\n\ntype GroupSectionType =\n | DataItem<TeamRowProps, SectionTypes.teams>\n | DataItem<GroupRowProps, SectionTypes.groups>\n\nconst selectActiveWithFirst =\n (number: number) =>\n <T extends GroupSectionType>(groups: T[]): T[] => {\n const activeGroupIndex = groups.findIndex(group => group.data.isActive)\n const activeGroup = groups[activeGroupIndex]\n\n if (!activeGroup || activeGroupIndex <= number) {\n return groups.slice(0, number)\n }\n\n return [activeGroup, ...groups].slice(0, number)\n }\n"]}
@@ -0,0 +1,31 @@
1
+ import React, { PropsWithChildren } from 'react';
2
+ import { ViewStyle } from 'react-native';
3
+ import { GroupResource } from '../../../types/resources/group_resource';
4
+ import { FilterTypes } from '../filter_types';
5
+ import { FilteredGroup } from '../hooks/filters';
6
+ import { ConversationFilterStackParamList } from '../screen_props';
7
+ export type FilterProps = {
8
+ group_source_app_name?: string;
9
+ isActive: boolean;
10
+ filter: FilterTypes;
11
+ };
12
+ export declare const FilterRow: ({ group_source_app_name, isActive, filter }: FilterProps) => React.JSX.Element;
13
+ export type GroupRowProps = {
14
+ group: FilteredGroup;
15
+ isActive: boolean;
16
+ };
17
+ export declare const GroupRow: ({ group, isActive }: GroupRowProps) => React.JSX.Element;
18
+ export type TeamRowProps = {
19
+ team: GroupResource;
20
+ isActive: boolean;
21
+ };
22
+ export declare const TeamRow: ({ team }: TeamRowProps) => React.JSX.Element;
23
+ export type ViewMoreRowProps = {
24
+ routeName: keyof ConversationFilterStackParamList;
25
+ };
26
+ export declare const ViewMore: ({ routeName }: ViewMoreRowProps) => React.JSX.Element;
27
+ export declare const PressableRow: ({ children, onPress, style, }: PropsWithChildren<{
28
+ onPress: () => void;
29
+ style?: ViewStyle;
30
+ }>) => React.JSX.Element;
31
+ //# sourceMappingURL=rows.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rows.d.ts","sourceRoot":"","sources":["../../../../src/screens/conversation_filters/components/rows.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAE,iBAAiB,EAAc,MAAM,OAAO,CAAA;AAC5D,OAAO,EAAoB,SAAS,EAAE,MAAM,cAAc,CAAA;AAI1D,OAAO,EAAE,aAAa,EAAE,MAAM,yCAAyC,CAAA;AAEvE,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,gCAAgC,EAAE,MAAM,iBAAiB,CAAA;AAElE,MAAM,MAAM,WAAW,GAAG;IAAE,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,WAAW,CAAA;CAAE,CAAA;AAEpG,eAAO,MAAM,SAAS,gDAAiD,WAAW,sBAUjF,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,aAAa,CAAA;IACpB,QAAQ,EAAE,OAAO,CAAA;CAClB,CAAA;AAED,eAAO,MAAM,QAAQ,wBAAyB,aAAa,sBA6B1D,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,aAAa,CAAA;IACnB,QAAQ,EAAE,OAAO,CAAA;CAClB,CAAA;AAED,eAAO,MAAM,OAAO,aAAc,YAAY,sBA0B7C,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAAE,SAAS,EAAE,MAAM,gCAAgC,CAAA;CAAE,CAAA;AAEpF,eAAO,MAAM,QAAQ,kBAAmB,gBAAgB,sBASvD,CAAA;AAED,eAAO,MAAM,YAAY,kCAItB,iBAAiB,CAAC;IAAE,OAAO,EAAE,MAAM,IAAI,CAAC;IAAC,KAAK,CAAC,EAAE,SAAS,CAAA;CAAE,CAAC,sBAO/D,CAAA"}
@@ -0,0 +1,111 @@
1
+ import { PlatformPressable } from '@react-navigation/elements';
2
+ import { useNavigation } from '@react-navigation/native';
3
+ import React, { useContext } from 'react';
4
+ import { StyleSheet, View } from 'react-native';
5
+ import { Heading, Icon, Image, Text, TextButton } from '../../../components';
6
+ import { useTheme } from '../../../hooks';
7
+ import { useServicesTeamsMap } from '../../../hooks/use_services_team';
8
+ import { FilterContext } from '../context/conversation_filter_context';
9
+ export const FilterRow = ({ group_source_app_name, isActive, filter }) => {
10
+ const styles = useRowStyles();
11
+ const { setAppFilter } = useContext(FilterContext);
12
+ return (<PressableRow style={styles.row} onPress={() => setAppFilter({ group_source_app_name })}>
13
+ <Text>{filter}</Text>
14
+ {isActive ? <Icon name="general.check" size={16} style={styles.rowIconRight}/> : null}
15
+ </PressableRow>);
16
+ };
17
+ export const GroupRow = ({ group, isActive }) => {
18
+ const styles = useRowStyles();
19
+ const { setGroupFilter } = useContext(FilterContext);
20
+ const handleFilterByGroup = () => {
21
+ setGroupFilter({ chat_group_graph_id: group.id });
22
+ };
23
+ const { headerImage, membershipsCount } = group;
24
+ return (<PressableRow style={styles.row} onPress={handleFilterByGroup}>
25
+ {headerImage?.thumbnail && (<Image source={{ uri: headerImage?.thumbnail }} resizeMode="cover" style={styles.rowImage} alt={`Image for ${group.name}`}/>)}
26
+ <View>
27
+ <Heading variant="h3" style={styles.rowTitle}>
28
+ {group.name}
29
+ </Heading>
30
+ {membershipsCount && <Text>{group.membershipsCount} members</Text>}
31
+ </View>
32
+ {isActive ? <Icon name="general.check" size={16} style={styles.rowIconRight}/> : null}
33
+ </PressableRow>);
34
+ };
35
+ export const TeamRow = ({ team }) => {
36
+ const styles = useRowStyles();
37
+ const { setGroupFilter } = useContext(FilterContext);
38
+ const servicesTeams = useServicesTeamsMap();
39
+ const { params } = useContext(FilterContext);
40
+ const { chat_group_graph_id } = params;
41
+ const isActive = chat_group_graph_id === team.id.toString();
42
+ const handleFilterByGroup = () => {
43
+ setGroupFilter({ chat_group_graph_id: team.id });
44
+ };
45
+ const servicesTeam = servicesTeams[team.id];
46
+ const serviceTypeName = servicesTeam?.serviceTypeName || servicesTeam?.group;
47
+ return (<PressableRow style={styles.row} onPress={handleFilterByGroup}>
48
+ <View>
49
+ <Heading variant="h3" style={styles.rowTitle}>
50
+ {team.name}
51
+ </Heading>
52
+ <Text>{serviceTypeName}</Text>
53
+ </View>
54
+ {isActive ? <Icon name="general.check" size={16} style={styles.rowIconRight}/> : null}
55
+ </PressableRow>);
56
+ };
57
+ export const ViewMore = ({ routeName }) => {
58
+ const styles = useRowStyles();
59
+ const navigation = useNavigation();
60
+ return (<View style={[styles.borderLessRow]}>
61
+ <TextButton onPress={() => navigation.navigate(routeName, {})}>View more</TextButton>
62
+ </View>);
63
+ };
64
+ export const PressableRow = ({ children, onPress, style, }) => {
65
+ const styles = useRowStyles();
66
+ return (<PlatformPressable style={styles.container} onPress={onPress}>
67
+ <View style={[styles.innerContainer, style]}>{children}</View>
68
+ </PlatformPressable>);
69
+ };
70
+ const ASPECT_RATIO = 16 / 9;
71
+ const THUMBNAIL_WIDTH = 80;
72
+ const THUMBNAIL_HEIGHT = THUMBNAIL_WIDTH / ASPECT_RATIO;
73
+ const useRowStyles = () => {
74
+ const theme = useTheme();
75
+ return StyleSheet.create({
76
+ container: {
77
+ paddingLeft: 16,
78
+ },
79
+ innerContainer: {
80
+ flexDirection: 'row',
81
+ alignItems: 'center',
82
+ gap: 12,
83
+ borderBottomWidth: 1,
84
+ borderBottomColor: theme.colors.fillColorNeutral050Base,
85
+ paddingVertical: 12,
86
+ paddingRight: 16,
87
+ },
88
+ borderLessRow: {
89
+ flexDirection: 'row',
90
+ alignItems: 'center',
91
+ gap: 12,
92
+ paddingVertical: 12,
93
+ paddingRight: 16,
94
+ paddingLeft: 16,
95
+ },
96
+ row: {},
97
+ rowImage: {
98
+ width: THUMBNAIL_WIDTH,
99
+ height: THUMBNAIL_HEIGHT,
100
+ borderRadius: 4,
101
+ },
102
+ rowIconRight: {
103
+ marginLeft: 'auto',
104
+ color: theme.colors.statusSuccessIcon,
105
+ },
106
+ rowTitle: {
107
+ fontSize: 16,
108
+ },
109
+ });
110
+ };
111
+ //# sourceMappingURL=rows.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rows.js","sourceRoot":"","sources":["../../../../src/screens/conversation_filters/components/rows.tsx"],"names":[],"mappings":"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","sourcesContent":["import { PlatformPressable } from '@react-navigation/elements'\nimport { NavigationProp, useNavigation } from '@react-navigation/native'\nimport React, { PropsWithChildren, useContext } from 'react'\nimport { StyleSheet, View, ViewStyle } from 'react-native'\nimport { Heading, Icon, Image, Text, TextButton } from '../../../components'\nimport { useTheme } from '../../../hooks'\nimport { useServicesTeamsMap } from '../../../hooks/use_services_team'\nimport { GroupResource } from '../../../types/resources/group_resource'\nimport { FilterContext } from '../context/conversation_filter_context'\nimport { FilterTypes } from '../filter_types'\nimport { FilteredGroup } from '../hooks/filters'\nimport { ConversationFilterStackParamList } from '../screen_props'\n\nexport type FilterProps = { group_source_app_name?: string; isActive: boolean; filter: FilterTypes }\n\nexport const FilterRow = ({ group_source_app_name, isActive, filter }: FilterProps) => {\n const styles = useRowStyles()\n const { setAppFilter } = useContext(FilterContext)\n\n return (\n <PressableRow style={styles.row} onPress={() => setAppFilter({ group_source_app_name })}>\n <Text>{filter}</Text>\n {isActive ? <Icon name=\"general.check\" size={16} style={styles.rowIconRight} /> : null}\n </PressableRow>\n )\n}\n\nexport type GroupRowProps = {\n group: FilteredGroup\n isActive: boolean\n}\n\nexport const GroupRow = ({ group, isActive }: GroupRowProps) => {\n const styles = useRowStyles()\n const { setGroupFilter } = useContext(FilterContext)\n\n const handleFilterByGroup = () => {\n setGroupFilter({ chat_group_graph_id: group.id })\n }\n\n const { headerImage, membershipsCount } = group\n\n return (\n <PressableRow style={styles.row} onPress={handleFilterByGroup}>\n {headerImage?.thumbnail && (\n <Image\n source={{ uri: headerImage?.thumbnail }}\n resizeMode=\"cover\"\n style={styles.rowImage}\n alt={`Image for ${group.name}`}\n />\n )}\n <View>\n <Heading variant=\"h3\" style={styles.rowTitle}>\n {group.name}\n </Heading>\n {membershipsCount && <Text>{group.membershipsCount} members</Text>}\n </View>\n {isActive ? <Icon name=\"general.check\" size={16} style={styles.rowIconRight} /> : null}\n </PressableRow>\n )\n}\n\nexport type TeamRowProps = {\n team: GroupResource\n isActive: boolean\n}\n\nexport const TeamRow = ({ team }: TeamRowProps) => {\n const styles = useRowStyles()\n const { setGroupFilter } = useContext(FilterContext)\n const servicesTeams = useServicesTeamsMap()\n const { params } = useContext(FilterContext)\n const { chat_group_graph_id } = params\n const isActive = chat_group_graph_id === team.id.toString()\n\n const handleFilterByGroup = () => {\n setGroupFilter({ chat_group_graph_id: team.id })\n }\n\n const servicesTeam = servicesTeams[team.id]\n const serviceTypeName = servicesTeam?.serviceTypeName || servicesTeam?.group\n\n return (\n <PressableRow style={styles.row} onPress={handleFilterByGroup}>\n <View>\n <Heading variant=\"h3\" style={styles.rowTitle}>\n {team.name}\n </Heading>\n <Text>{serviceTypeName}</Text>\n </View>\n {isActive ? <Icon name=\"general.check\" size={16} style={styles.rowIconRight} /> : null}\n </PressableRow>\n )\n}\n\nexport type ViewMoreRowProps = { routeName: keyof ConversationFilterStackParamList }\n\nexport const ViewMore = ({ routeName }: ViewMoreRowProps) => {\n const styles = useRowStyles()\n const navigation = useNavigation<NavigationProp<ConversationFilterStackParamList, 'Filters'>>()\n\n return (\n <View style={[styles.borderLessRow]}>\n <TextButton onPress={() => navigation.navigate(routeName, {})}>View more</TextButton>\n </View>\n )\n}\n\nexport const PressableRow = ({\n children,\n onPress,\n style,\n}: PropsWithChildren<{ onPress: () => void; style?: ViewStyle }>) => {\n const styles = useRowStyles()\n return (\n <PlatformPressable style={styles.container} onPress={onPress}>\n <View style={[styles.innerContainer, style]}>{children}</View>\n </PlatformPressable>\n )\n}\n\nconst ASPECT_RATIO = 16 / 9\nconst THUMBNAIL_WIDTH = 80\nconst THUMBNAIL_HEIGHT = THUMBNAIL_WIDTH / ASPECT_RATIO\n\nconst useRowStyles = () => {\n const theme = useTheme()\n return StyleSheet.create({\n container: {\n paddingLeft: 16,\n },\n innerContainer: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 12,\n borderBottomWidth: 1,\n borderBottomColor: theme.colors.fillColorNeutral050Base,\n paddingVertical: 12,\n paddingRight: 16,\n },\n borderLessRow: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 12,\n paddingVertical: 12,\n paddingRight: 16,\n paddingLeft: 16,\n },\n row: {},\n rowImage: {\n width: THUMBNAIL_WIDTH,\n height: THUMBNAIL_HEIGHT,\n borderRadius: 4,\n },\n rowIconRight: {\n marginLeft: 'auto',\n color: theme.colors.statusSuccessIcon,\n },\n rowTitle: {\n fontSize: 16,\n },\n })\n}\n"]}
@@ -0,0 +1,23 @@
1
+ import React from 'react';
2
+ import { PropsWithChildren } from 'react';
3
+ import { ConversationFiltersParams } from '../screen_props';
4
+ export declare const FilterContext: React.Context<{
5
+ params: ConversationFiltersParams;
6
+ scrollOffset: number;
7
+ setScrollOffset: (offset: number) => void;
8
+ resetFilter: () => void;
9
+ setGroupFilter: (params: ConversationFiltersParams) => void;
10
+ setAppFilter: (params: ConversationFiltersParams) => void;
11
+ applyFilters: (params: ConversationFiltersParams) => void;
12
+ }>;
13
+ export declare const FilterProvider: ({ children }: PropsWithChildren) => React.JSX.Element;
14
+ export declare const useFilterContext: () => {
15
+ params: ConversationFiltersParams;
16
+ scrollOffset: number;
17
+ setScrollOffset: (offset: number) => void;
18
+ resetFilter: () => void;
19
+ setGroupFilter: (params: ConversationFiltersParams) => void;
20
+ setAppFilter: (params: ConversationFiltersParams) => void;
21
+ applyFilters: (params: ConversationFiltersParams) => void;
22
+ };
23
+ //# sourceMappingURL=conversation_filter_context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation_filter_context.d.ts","sourceRoot":"","sources":["../../../../src/screens/conversation_filters/context/conversation_filter_context.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAiB,iBAAiB,EAAY,MAAM,OAAO,CAAA;AAClE,OAAO,EAAE,yBAAyB,EAAkC,MAAM,iBAAiB,CAAA;AAG3F,eAAO,MAAM,aAAa;YAChB,yBAAyB;kBACnB,MAAM;qBACH,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI;iBAC5B,MAAM,IAAI;oBACP,CAAC,MAAM,EAAE,yBAAyB,KAAK,IAAI;kBAC7C,CAAC,MAAM,EAAE,yBAAyB,KAAK,IAAI;kBAC3C,CAAC,MAAM,EAAE,yBAAyB,KAAK,IAAI;EAYzD,CAAA;AAEF,eAAO,MAAM,cAAc,iBAAkB,iBAAiB,sBAkC7D,CAAA;AAED,eAAO,MAAM,gBAAgB;YAxDnB,yBAAyB;kBACnB,MAAM;qBACH,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI;iBAC5B,MAAM,IAAI;oBACP,CAAC,MAAM,EAAE,yBAAyB,KAAK,IAAI;kBAC7C,CAAC,MAAM,EAAE,yBAAyB,KAAK,IAAI;kBAC3C,CAAC,MAAM,EAAE,yBAAyB,KAAK,IAAI;CAoD1D,CAAA"}
@@ -0,0 +1,51 @@
1
+ import React from 'react';
2
+ import { createContext, useState } from 'react';
3
+ import { StackActions, useNavigation, useRoute } from '@react-navigation/native';
4
+ export const FilterContext = createContext({
5
+ params: {
6
+ chat_group_graph_id: undefined,
7
+ group_source_app_name: undefined,
8
+ },
9
+ scrollOffset: 0,
10
+ setScrollOffset: () => { },
11
+ resetFilter: () => { },
12
+ setGroupFilter: () => { },
13
+ setAppFilter: () => { },
14
+ applyFilters: () => { },
15
+ });
16
+ export const FilterProvider = ({ children }) => {
17
+ const [scrollOffset, setScrollOffset] = useState(0);
18
+ const navigation = useNavigation();
19
+ const route = useRoute();
20
+ const filterContextValue = {
21
+ params: route.params,
22
+ scrollOffset,
23
+ setScrollOffset,
24
+ resetFilter: () => {
25
+ navigation.dispatch(StackActions.popTo('Conversations', {
26
+ chat_group_graph_id: undefined,
27
+ group_source_app_name: undefined,
28
+ }));
29
+ },
30
+ setGroupFilter: (params) => {
31
+ navigation.setParams({
32
+ chat_group_graph_id: params.chat_group_graph_id,
33
+ group_source_app_name: undefined,
34
+ });
35
+ },
36
+ setAppFilter: (params) => {
37
+ navigation.setParams({
38
+ chat_group_graph_id: undefined,
39
+ group_source_app_name: params.group_source_app_name,
40
+ });
41
+ },
42
+ applyFilters: (params) => {
43
+ navigation.dispatch(StackActions.popTo('Conversations', params));
44
+ },
45
+ };
46
+ return <FilterContext.Provider value={filterContextValue}>{children}</FilterContext.Provider>;
47
+ };
48
+ export const useFilterContext = () => {
49
+ return React.useContext(FilterContext);
50
+ };
51
+ //# sourceMappingURL=conversation_filter_context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation_filter_context.js","sourceRoot":"","sources":["../../../../src/screens/conversation_filters/context/conversation_filter_context.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,aAAa,EAAqB,QAAQ,EAAE,MAAM,OAAO,CAAA;AAElE,OAAO,EAAa,YAAY,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AAE3F,MAAM,CAAC,MAAM,aAAa,GAAG,aAAa,CAQvC;IACD,MAAM,EAAE;QACN,mBAAmB,EAAE,SAAS;QAC9B,qBAAqB,EAAE,SAAS;KACjC;IACD,YAAY,EAAE,CAAC;IACf,eAAe,EAAE,GAAG,EAAE,GAAE,CAAC;IACzB,WAAW,EAAE,GAAG,EAAE,GAAE,CAAC;IACrB,cAAc,EAAE,GAAG,EAAE,GAAE,CAAC;IACxB,YAAY,EAAE,GAAG,EAAE,GAAE,CAAC;IACtB,YAAY,EAAE,GAAG,EAAE,GAAE,CAAC;CACvB,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,EAAE,QAAQ,EAAqB,EAAE,EAAE;IAChE,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;IACnD,MAAM,UAAU,GAAG,aAAa,EAAE,CAAA;IAClC,MAAM,KAAK,GAAG,QAAQ,EAAsD,CAAA;IAC5E,MAAM,kBAAkB,GAAG;QACzB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,YAAY;QACZ,eAAe;QACf,WAAW,EAAE,GAAG,EAAE;YAChB,UAAU,CAAC,QAAQ,CACjB,YAAY,CAAC,KAAK,CAAC,eAAe,EAAE;gBAClC,mBAAmB,EAAE,SAAS;gBAC9B,qBAAqB,EAAE,SAAS;aACjC,CAAC,CACH,CAAA;QACH,CAAC;QACD,cAAc,EAAE,CAAC,MAAgE,EAAE,EAAE;YACnF,UAAU,CAAC,SAAS,CAAC;gBACnB,mBAAmB,EAAE,MAAM,CAAC,mBAAmB;gBAC/C,qBAAqB,EAAE,SAAS;aACjC,CAAC,CAAA;QACJ,CAAC;QACD,YAAY,EAAE,CAAC,MAA8D,EAAE,EAAE;YAC/E,UAAU,CAAC,SAAS,CAAC;gBACnB,mBAAmB,EAAE,SAAS;gBAC9B,qBAAqB,EAAE,MAAM,CAAC,qBAAqB;aACpD,CAAC,CAAA;QACJ,CAAC;QACD,YAAY,EAAE,CAAC,MAAiC,EAAE,EAAE;YAClD,UAAU,CAAC,QAAQ,CAAC,YAAY,CAAC,KAAK,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC,CAAA;QAClE,CAAC;KACF,CAAA;IAED,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAA;AAC/F,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,EAAE;IACnC,OAAO,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC,CAAA;AACxC,CAAC,CAAA","sourcesContent":["import React from 'react'\nimport { createContext, PropsWithChildren, useState } from 'react'\nimport { ConversationFiltersParams, ConversationFiltersScreenProps } from '../screen_props'\nimport { RouteProp, StackActions, useNavigation, useRoute } from '@react-navigation/native'\n\nexport const FilterContext = createContext<{\n params: ConversationFiltersParams\n scrollOffset: number\n setScrollOffset: (offset: number) => void\n resetFilter: () => void\n setGroupFilter: (params: ConversationFiltersParams) => void\n setAppFilter: (params: ConversationFiltersParams) => void\n applyFilters: (params: ConversationFiltersParams) => void\n}>({\n params: {\n chat_group_graph_id: undefined,\n group_source_app_name: undefined,\n },\n scrollOffset: 0,\n setScrollOffset: () => {},\n resetFilter: () => {},\n setGroupFilter: () => {},\n setAppFilter: () => {},\n applyFilters: () => {},\n})\n\nexport const FilterProvider = ({ children }: PropsWithChildren) => {\n const [scrollOffset, setScrollOffset] = useState(0)\n const navigation = useNavigation()\n const route = useRoute<RouteProp<ConversationFiltersScreenProps['route']>>()\n const filterContextValue = {\n params: route.params,\n scrollOffset,\n setScrollOffset,\n resetFilter: () => {\n navigation.dispatch(\n StackActions.popTo('Conversations', {\n chat_group_graph_id: undefined,\n group_source_app_name: undefined,\n })\n )\n },\n setGroupFilter: (params: Omit<ConversationFiltersParams, 'group_source_app_name'>) => {\n navigation.setParams({\n chat_group_graph_id: params.chat_group_graph_id,\n group_source_app_name: undefined,\n })\n },\n setAppFilter: (params: Omit<ConversationFiltersParams, 'chat_group_graph_id'>) => {\n navigation.setParams({\n chat_group_graph_id: undefined,\n group_source_app_name: params.group_source_app_name,\n })\n },\n applyFilters: (params: ConversationFiltersParams) => {\n navigation.dispatch(StackActions.popTo('Conversations', params))\n },\n }\n\n return <FilterContext.Provider value={filterContextValue}>{children}</FilterContext.Provider>\n}\n\nexport const useFilterContext = () => {\n return React.useContext(FilterContext)\n}\n"]}
@@ -0,0 +1,7 @@
1
+ export declare enum FilterTypes {
2
+ All = "All conversations",
3
+ Groups = "All my groups",
4
+ Teams = "All my teams and plans",
5
+ More = "More"
6
+ }
7
+ //# sourceMappingURL=filter_types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filter_types.d.ts","sourceRoot":"","sources":["../../../src/screens/conversation_filters/filter_types.ts"],"names":[],"mappings":"AAAA,oBAAY,WAAW;IACrB,GAAG,sBAAsB;IACzB,MAAM,kBAAkB;IACxB,KAAK,2BAA2B;IAChC,IAAI,SAAS;CACd"}
@@ -0,0 +1,8 @@
1
+ export var FilterTypes;
2
+ (function (FilterTypes) {
3
+ FilterTypes["All"] = "All conversations";
4
+ FilterTypes["Groups"] = "All my groups";
5
+ FilterTypes["Teams"] = "All my teams and plans";
6
+ FilterTypes["More"] = "More";
7
+ })(FilterTypes || (FilterTypes = {}));
8
+ //# sourceMappingURL=filter_types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filter_types.js","sourceRoot":"","sources":["../../../src/screens/conversation_filters/filter_types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,WAKX;AALD,WAAY,WAAW;IACrB,wCAAyB,CAAA;IACzB,uCAAwB,CAAA;IACxB,+CAAgC,CAAA;IAChC,4BAAa,CAAA;AACf,CAAC,EALW,WAAW,KAAX,WAAW,QAKtB","sourcesContent":["export enum FilterTypes {\n All = 'All conversations',\n Groups = 'All my groups',\n Teams = 'All my teams and plans',\n More = 'More',\n}\n"]}
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ import { ConversationFiltersParams } from './screen_props';
3
+ import { StaticScreenProps } from '@react-navigation/native';
4
+ export type GroupFiltersScreenProps = StaticScreenProps<ConversationFiltersParams>;
5
+ export declare const GroupFilters: () => React.JSX.Element;
6
+ //# sourceMappingURL=group_filters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"group_filters.d.ts","sourceRoot":"","sources":["../../../src/screens/conversation_filters/group_filters.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB,OAAO,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAA;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAK5D,MAAM,MAAM,uBAAuB,GAAG,iBAAiB,CAAC,yBAAyB,CAAC,CAAA;AAElF,eAAO,MAAM,YAAY,yBAmBxB,CAAA"}
@@ -0,0 +1,15 @@
1
+ import React from 'react';
2
+ import { FlatList, RefreshControl, View } from 'react-native';
3
+ import { Text } from '../../components/display';
4
+ import { useGroupsToFilter } from './hooks/filters';
5
+ import { GroupRow } from './components/rows';
6
+ import { useFilterContext } from './context/conversation_filter_context';
7
+ export const GroupFilters = () => {
8
+ const { groups, fetchNextPage, isRefetching, refetch } = useGroupsToFilter();
9
+ const { params } = useFilterContext();
10
+ const { chat_group_graph_id } = params;
11
+ return (<View>
12
+ <FlatList data={groups} renderItem={({ item }) => (<GroupRow group={item} isActive={item?.id.toString() === chat_group_graph_id}/>)} ListEmptyComponent={<Text>No groups available</Text>} refreshing={isRefetching} refreshControl={<RefreshControl refreshing={isRefetching} onRefresh={refetch}/>} onEndReached={() => fetchNextPage()}/>
13
+ </View>);
14
+ };
15
+ //# sourceMappingURL=group_filters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"group_filters.js","sourceRoot":"","sources":["../../../src/screens/conversation_filters/group_filters.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAC7D,OAAO,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAA;AAG/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAA;AAIxE,MAAM,CAAC,MAAM,YAAY,GAAG,GAAG,EAAE;IAC/B,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,iBAAiB,EAAE,CAAA;IAC5E,MAAM,EAAE,MAAM,EAAE,GAAG,gBAAgB,EAAE,CAAA;IACrC,MAAM,EAAE,mBAAmB,EAAE,GAAG,MAAM,CAAA;IAEtC,OAAO,CACL,CAAC,IAAI,CACH;MAAA,CAAC,QAAQ,CACP,IAAI,CAAC,CAAC,MAAM,CAAC,CACb,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CACxB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,EAAE,KAAK,mBAAmB,CAAC,EAAG,CACjF,CAAC,CACF,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAAC,CACrD,UAAU,CAAC,CAAC,YAAY,CAAC,CACzB,cAAc,CAAC,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,EAAG,CAAC,CACjF,YAAY,CAAC,CAAC,GAAG,EAAE,CAAC,aAAa,EAAE,CAAC,EAExC;IAAA,EAAE,IAAI,CAAC,CACR,CAAA;AACH,CAAC,CAAA","sourcesContent":["import React from 'react'\nimport { FlatList, RefreshControl, View } from 'react-native'\nimport { Text } from '../../components/display'\nimport { ConversationFiltersParams } from './screen_props'\nimport { StaticScreenProps } from '@react-navigation/native'\nimport { useGroupsToFilter } from './hooks/filters'\nimport { GroupRow } from './components/rows'\nimport { useFilterContext } from './context/conversation_filter_context'\n\nexport type GroupFiltersScreenProps = StaticScreenProps<ConversationFiltersParams>\n\nexport const GroupFilters = () => {\n const { groups, fetchNextPage, isRefetching, refetch } = useGroupsToFilter()\n const { params } = useFilterContext()\n const { chat_group_graph_id } = params\n\n return (\n <View>\n <FlatList\n data={groups}\n renderItem={({ item }) => (\n <GroupRow group={item} isActive={item?.id.toString() === chat_group_graph_id} />\n )}\n ListEmptyComponent={<Text>No groups available</Text>}\n refreshing={isRefetching}\n refreshControl={<RefreshControl refreshing={isRefetching} onRefresh={refetch} />}\n onEndReached={() => fetchNextPage()}\n />\n </View>\n )\n}\n"]}