Skip to content

Commit 274006b

Browse files
Merge pull request Expensify#88768 from aswin-s/feat/add-share-option-to-saved-searches
Add share option to saved searches overflow menu
2 parents 8a6183e + bafcd27 commit 274006b

17 files changed

Lines changed: 230 additions & 12 deletions

File tree

src/components/ThreeDotsMenu/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ function ThreeDotsMenu({
6565
};
6666

6767
const hidePopoverMenu = useCallback((selectedItem?: PopoverMenuItem) => {
68-
if (selectedItem?.shouldKeepModalOpen) {
68+
if (selectedItem?.shouldKeepModalOpen || selectedItem?.shouldCloseModalOnSelect === false) {
6969
return;
7070
}
7171
setPopupMenuVisible(false);

src/hooks/useShareSavedSearch.ts

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import {useEffect, useRef, useState} from 'react';
2+
import Clipboard from '@libs/Clipboard';
3+
import ROUTES from '@src/ROUTES';
4+
import useEnvironment from './useEnvironment';
5+
6+
// Matches the success state duration in useThrottledButtonState used by ContextMenuItem
7+
const SHARE_FEEDBACK_DURATION_MS = 1800;
8+
9+
// Matches the shouldDelay close timing in hideContextMenu (ReportActionContextMenu.ts)
10+
const MENU_CLOSE_DELAY_MS = 800;
11+
12+
function useShareSavedSearch() {
13+
const {environmentURL} = useEnvironment();
14+
const [copiedHash, setCopiedHash] = useState<number | null>(null);
15+
const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);
16+
17+
useEffect(() => {
18+
return () => {
19+
clearTimeout(timeoutRef.current ?? undefined);
20+
};
21+
}, []);
22+
23+
const handleShare = (itemHash: number, itemQuery: string) => {
24+
const url = `${environmentURL}/${ROUTES.SEARCH_ROOT.getRoute({query: itemQuery})}`;
25+
Clipboard.setString(url);
26+
setCopiedHash(itemHash);
27+
28+
if (timeoutRef.current !== null) {
29+
clearTimeout(timeoutRef.current);
30+
}
31+
timeoutRef.current = setTimeout(() => {
32+
setCopiedHash((prev) => (prev === itemHash ? null : prev));
33+
timeoutRef.current = null;
34+
}, SHARE_FEEDBACK_DURATION_MS);
35+
};
36+
37+
return {copiedHash, handleShare};
38+
}
39+
40+
export {MENU_CLOSE_DELAY_MS};
41+
export default useShareSavedSearch;

src/languages/de.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7732,6 +7732,7 @@ Fügen Sie weitere Ausgabelimits hinzu, um den Cashflow Ihres Unternehmens zu sc
77327732
deleteSavedSearchConfirm: 'Möchtest du diese Suche wirklich löschen?',
77337733
searchName: 'Namen suchen',
77347734
savedSearchesMenuItemTitle: 'Gespeichert',
7735+
urlCopied: 'URL kopiert',
77357736
groupedExpenses: 'gruppierte Ausgaben',
77367737
bulkActions: {
77377738
editMultiple: 'Mehrere bearbeiten',

src/languages/en.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7753,6 +7753,7 @@ const translations = {
77537753
deleteSavedSearchConfirm: 'Are you sure you want to delete this search?',
77547754
searchName: 'Search name',
77557755
savedSearchesMenuItemTitle: 'Saved',
7756+
urlCopied: 'URL copied',
77567757
spendOverTime: 'Spend over time',
77577758
groupedExpenses: 'grouped expenses',
77587759
bulkActions: {

src/languages/es.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7574,6 +7574,7 @@ ${amount} para ${merchant} - ${date}`,
75747574
view: {label: 'Ver', table: 'Tabla', bar: 'Barra', line: 'Línea', pie: 'Circular'},
75757575
saveSearch: 'Guardar búsqueda',
75767576
savedSearchesMenuItemTitle: 'Guardadas',
7577+
urlCopied: 'URL copiada',
75777578
spendOverTime: 'Evolución de gastos',
75787579
searchName: 'Nombre de la búsqueda',
75797580
deleteSavedSearch: 'Eliminar búsqueda guardada',

src/languages/fr.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7754,6 +7754,7 @@ Ajoutez davantage de règles de dépenses pour protéger la trésorerie de l’e
77547754
deleteSavedSearchConfirm: 'Voulez-vous vraiment supprimer cette recherche ?',
77557755
searchName: 'Rechercher un nom',
77567756
savedSearchesMenuItemTitle: 'Enregistré',
7757+
urlCopied: 'URL copiée',
77577758
groupedExpenses: 'dépenses groupées',
77587759
bulkActions: {
77597760
editMultiple: 'Modifier plusieurs',

src/languages/it.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7723,6 +7723,7 @@ Aggiungi altre regole di spesa per proteggere il flusso di cassa aziendale.`,
77237723
deleteSavedSearchConfirm: 'Sei sicuro di voler eliminare questa ricerca?',
77247724
searchName: 'Cerca nome',
77257725
savedSearchesMenuItemTitle: 'Salvato',
7726+
urlCopied: 'URL copiato',
77267727
groupedExpenses: 'spese raggruppate',
77277728
bulkActions: {
77287729
editMultiple: 'Modifica multipli',

src/languages/ja.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7629,6 +7629,7 @@ ${reportName}
76297629
deleteSavedSearchConfirm: 'この検索を削除してもよろしいですか?',
76307630
searchName: '名前を検索',
76317631
savedSearchesMenuItemTitle: '保存済み',
7632+
urlCopied: 'URLをコピーしました',
76327633
groupedExpenses: 'グループ化された経費',
76337634
bulkActions: {
76347635
editMultiple: '複数を編集',

src/languages/nl.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7694,6 +7694,7 @@ er bestedingsregels toe om de kasstroom van het bedrijf te beschermen.`,
76947694
deleteSavedSearchConfirm: 'Weet je zeker dat je deze zoekopdracht wilt verwijderen?',
76957695
searchName: 'Zoeknaam',
76967696
savedSearchesMenuItemTitle: 'Opgeslagen',
7697+
urlCopied: 'URL gekopieerd',
76977698
groupedExpenses: 'gegroepeerde uitgaven',
76987699
bulkActions: {
76997700
editMultiple: 'Meerdere bewerken',

src/languages/pl.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7686,6 +7686,7 @@ Dodaj więcej zasad wydatków, żeby chronić płynność finansową firmy.`,
76867686
deleteSavedSearchConfirm: 'Na pewno chcesz usunąć to wyszukiwanie?',
76877687
searchName: 'Wyszukaj nazwę',
76887688
savedSearchesMenuItemTitle: 'Zapisano',
7689+
urlCopied: 'URL skopiowany',
76897690
groupedExpenses: 'zgrupowane wydatki',
76907691
bulkActions: {
76917692
editMultiple: 'Edytuj wiele',

0 commit comments

Comments
 (0)