this repo has no description
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Apply more useKey: true

+231 -213
+5
src/components/compose.jsx
··· 519 519 { 520 520 enabled: !supportsCloseWatcher, 521 521 enableOnFormTags: true, 522 + useKey: true, 522 523 }, 523 524 ); 524 525 useHotkeys( ··· 541 542 modals.length === 1 && modals[0].querySelector('#compose-container'); 542 543 return hasModal && !hasOnlyComposer; 543 544 }, 545 + useKey: true, 544 546 }, 545 547 ); 546 548 useCloseWatcher(() => { ··· 3141 3143 { 3142 3144 preventDefault: true, 3143 3145 enableOnFormTags: ['input'], 3146 + useKey: true, 3144 3147 }, 3145 3148 ); 3146 3149 ··· 3167 3170 { 3168 3171 preventDefault: true, 3169 3172 enableOnFormTags: ['input'], 3173 + useKey: true, 3170 3174 }, 3171 3175 ); 3172 3176 ··· 3192 3196 { 3193 3197 preventDefault: true, 3194 3198 enableOnFormTags: ['input'], 3199 + useKey: true, 3195 3200 }, 3196 3201 ); 3197 3202
+1
src/components/media-modal.jsx
··· 88 88 const hasModal = !!document.querySelector('#modal-container > *'); 89 89 return hasModal; 90 90 }, 91 + useKey: true, 91 92 }, 92 93 [onClose], 93 94 );
+1
src/components/modal.jsx
··· 43 43 // This will run "later" to prevent clash with esc handlers from other components 44 44 keydown: false, 45 45 keyup: true, 46 + useKey: true, 46 47 }, 47 48 [onClose], 48 49 );
+1
src/components/search-command.jsx
··· 45 45 enabled: showSearch, 46 46 enableOnFormTags: true, 47 47 preventDefault: true, 48 + useKey: true, 48 49 }, 49 50 ); 50 51
+3 -1
src/components/timeline.jsx
··· 262 262 behavior: 'smooth', 263 263 }); 264 264 }, [loadItems, showNewPostsIndicator]); 265 - const dotRef = useHotkeys('.', handleLoadNewPosts); 265 + const dotRef = useHotkeys('.', handleLoadNewPosts, { 266 + useKey: true, 267 + }); 266 268 267 269 // const { 268 270 // scrollDirection,
+209 -209
src/locales/en.po
··· 108 108 109 109 #: src/components/account-info.jsx:444 110 110 #: src/components/account-info.jsx:1202 111 - #: src/components/compose.jsx:2772 111 + #: src/components/compose.jsx:2774 112 112 #: src/components/media-alt-modal.jsx:46 113 - #: src/components/media-modal.jsx:358 113 + #: src/components/media-modal.jsx:359 114 114 #: src/components/status.jsx:1826 115 115 #: src/components/status.jsx:1843 116 116 #: src/components/status.jsx:1968 ··· 122 122 #: src/pages/list.jsx:158 123 123 #: src/pages/public.jsx:115 124 124 #: src/pages/scheduled-posts.jsx:87 125 - #: src/pages/status.jsx:1232 125 + #: src/pages/status.jsx:1239 126 126 #: src/pages/trending.jsx:469 127 127 msgid "More" 128 128 msgstr "" ··· 205 205 #: src/components/account-info.jsx:928 206 206 #: src/components/status.jsx:2372 207 207 #: src/pages/catchup.jsx:72 208 - #: src/pages/catchup.jsx:1447 209 - #: src/pages/catchup.jsx:2062 210 - #: src/pages/status.jsx:955 211 - #: src/pages/status.jsx:1578 208 + #: src/pages/catchup.jsx:1448 209 + #: src/pages/catchup.jsx:2063 210 + #: src/pages/status.jsx:962 211 + #: src/pages/status.jsx:1585 212 212 msgid "Replies" 213 213 msgstr "" 214 214 215 215 #: src/components/account-info.jsx:932 216 216 #: src/pages/catchup.jsx:73 217 - #: src/pages/catchup.jsx:1449 218 - #: src/pages/catchup.jsx:2074 217 + #: src/pages/catchup.jsx:1450 218 + #: src/pages/catchup.jsx:2075 219 219 #: src/pages/settings.jsx:1159 220 220 msgid "Boosts" 221 221 msgstr "" ··· 420 420 #: src/components/account-info.jsx:2064 421 421 #: src/components/account-info.jsx:2184 422 422 #: src/components/account-sheet.jsx:38 423 - #: src/components/compose.jsx:881 424 - #: src/components/compose.jsx:2728 425 - #: src/components/compose.jsx:3202 426 - #: src/components/compose.jsx:3411 427 - #: src/components/compose.jsx:3641 423 + #: src/components/compose.jsx:883 424 + #: src/components/compose.jsx:2730 425 + #: src/components/compose.jsx:3207 426 + #: src/components/compose.jsx:3416 427 + #: src/components/compose.jsx:3646 428 428 #: src/components/drafts.jsx:59 429 429 #: src/components/embed-modal.jsx:13 430 430 #: src/components/generic-accounts.jsx:143 431 431 #: src/components/keyboard-shortcuts-help.jsx:43 432 432 #: src/components/list-add-edit.jsx:36 433 433 #: src/components/media-alt-modal.jsx:34 434 - #: src/components/media-modal.jsx:322 434 + #: src/components/media-modal.jsx:323 435 435 #: src/components/notification-service.jsx:157 436 436 #: src/components/report-modal.jsx:75 437 437 #: src/components/shortcuts-settings.jsx:230 ··· 441 441 #: src/components/status.jsx:3323 442 442 #: src/components/status.jsx:3832 443 443 #: src/pages/accounts.jsx:37 444 - #: src/pages/catchup.jsx:1583 444 + #: src/pages/catchup.jsx:1584 445 445 #: src/pages/filters.jsx:225 446 446 #: src/pages/list.jsx:276 447 447 #: src/pages/notifications.jsx:934 448 448 #: src/pages/scheduled-posts.jsx:257 449 449 #: src/pages/settings.jsx:87 450 - #: src/pages/status.jsx:1319 450 + #: src/pages/status.jsx:1326 451 451 msgid "Close" 452 452 msgstr "" 453 453 ··· 556 556 #: src/components/columns.jsx:27 557 557 #: src/components/nav-menu.jsx:176 558 558 #: src/components/shortcuts-settings.jsx:139 559 - #: src/components/timeline.jsx:463 560 - #: src/pages/catchup.jsx:882 559 + #: src/components/timeline.jsx:465 560 + #: src/pages/catchup.jsx:883 561 561 #: src/pages/filters.jsx:90 562 562 #: src/pages/followed-hashtags.jsx:41 563 563 #: src/pages/home.jsx:54 ··· 613 613 #. placeholder {0}: unsupportedFiles.length 614 614 #. placeholder {1}: unsupportedFiles[0].name 615 615 #. placeholder {2}: lf.format( unsupportedFiles.map((f) => f.name), ) 616 - #: src/components/compose.jsx:644 616 + #: src/components/compose.jsx:646 617 617 msgid "{0, plural, one {File {1} is not supported.} other {Files {2} are not supported.}}" 618 618 msgstr "{0, plural, one {File {1} is not supported.} other {Files {2} are not supported.}}" 619 619 620 - #: src/components/compose.jsx:654 621 - #: src/components/compose.jsx:672 622 - #: src/components/compose.jsx:1777 623 - #: src/components/compose.jsx:1902 620 + #: src/components/compose.jsx:656 621 + #: src/components/compose.jsx:674 622 + #: src/components/compose.jsx:1779 623 + #: src/components/compose.jsx:1904 624 624 msgid "{maxMediaAttachments, plural, one {You can only attach up to 1 file.} other {You can only attach up to # files.}}" 625 625 msgstr "" 626 626 627 - #: src/components/compose.jsx:862 627 + #: src/components/compose.jsx:864 628 628 msgid "Pop out" 629 629 msgstr "Pop out" 630 630 631 - #: src/components/compose.jsx:869 631 + #: src/components/compose.jsx:871 632 632 msgid "Minimize" 633 633 msgstr "Minimize" 634 634 635 - #: src/components/compose.jsx:905 635 + #: src/components/compose.jsx:907 636 636 msgid "Looks like you closed the parent window." 637 637 msgstr "Looks like you closed the parent window." 638 638 639 - #: src/components/compose.jsx:912 639 + #: src/components/compose.jsx:914 640 640 msgid "Looks like you already have a compose field open in the parent window and currently publishing. Please wait for it to be done and try again later." 641 641 msgstr "Looks like you already have a compose field open in the parent window and currently publishing. Please wait for it to be done and try again later." 642 642 643 - #: src/components/compose.jsx:917 643 + #: src/components/compose.jsx:919 644 644 msgid "Looks like you already have a compose field open in the parent window. Popping in this window will discard the changes you made in the parent window. Continue?" 645 645 msgstr "Looks like you already have a compose field open in the parent window. Popping in this window will discard the changes you made in the parent window. Continue?" 646 646 647 - #: src/components/compose.jsx:960 647 + #: src/components/compose.jsx:962 648 648 msgid "Pop in" 649 649 msgstr "Pop in" 650 650 651 651 #. placeholder {0}: replyToStatus.account.acct || replyToStatus.account.username 652 652 #. placeholder {1}: rtf.format(-replyToStatusMonthsAgo, 'month') 653 - #: src/components/compose.jsx:970 653 + #: src/components/compose.jsx:972 654 654 msgid "Replying to @{0}’s post (<0>{1}</0>)" 655 655 msgstr "" 656 656 657 657 #. placeholder {0}: replyToStatus.account.acct || replyToStatus.account.username 658 - #: src/components/compose.jsx:980 658 + #: src/components/compose.jsx:982 659 659 msgid "Replying to @{0}’s post" 660 660 msgstr "" 661 661 662 - #: src/components/compose.jsx:993 662 + #: src/components/compose.jsx:995 663 663 msgid "Editing source post" 664 664 msgstr "" 665 665 666 - #: src/components/compose.jsx:1046 666 + #: src/components/compose.jsx:1048 667 667 msgid "Poll must have at least 2 options" 668 668 msgstr "Poll must have at least 2 options" 669 669 670 - #: src/components/compose.jsx:1050 670 + #: src/components/compose.jsx:1052 671 671 msgid "Some poll choices are empty" 672 672 msgstr "Some poll choices are empty" 673 673 674 - #: src/components/compose.jsx:1063 674 + #: src/components/compose.jsx:1065 675 675 msgid "Some media have no descriptions. Continue?" 676 676 msgstr "Some media have no descriptions. Continue?" 677 677 678 - #: src/components/compose.jsx:1115 678 + #: src/components/compose.jsx:1117 679 679 msgid "Attachment #{i} failed" 680 680 msgstr "Attachment #{i} failed" 681 681 682 - #: src/components/compose.jsx:1211 682 + #: src/components/compose.jsx:1213 683 683 #: src/components/status.jsx:2156 684 - #: src/components/timeline.jsx:1017 684 + #: src/components/timeline.jsx:1019 685 685 msgid "Content warning" 686 686 msgstr "" 687 687 688 - #: src/components/compose.jsx:1227 688 + #: src/components/compose.jsx:1229 689 689 msgid "Content warning or sensitive media" 690 690 msgstr "Content warning or sensitive media" 691 691 692 - #: src/components/compose.jsx:1263 692 + #: src/components/compose.jsx:1265 693 693 #: src/components/status.jsx:96 694 694 #: src/pages/settings.jsx:315 695 695 msgid "Public" 696 696 msgstr "" 697 697 698 - #: src/components/compose.jsx:1268 698 + #: src/components/compose.jsx:1270 699 699 #: src/components/nav-menu.jsx:344 700 700 #: src/components/shortcuts-settings.jsx:165 701 701 #: src/components/status.jsx:97 702 702 msgid "Local" 703 703 msgstr "" 704 704 705 - #: src/components/compose.jsx:1272 705 + #: src/components/compose.jsx:1274 706 706 #: src/components/status.jsx:98 707 707 #: src/pages/settings.jsx:318 708 708 msgid "Unlisted" 709 709 msgstr "" 710 710 711 - #: src/components/compose.jsx:1275 711 + #: src/components/compose.jsx:1277 712 712 #: src/components/status.jsx:99 713 713 #: src/pages/settings.jsx:321 714 714 msgid "Followers only" 715 715 msgstr "" 716 716 717 - #: src/components/compose.jsx:1278 717 + #: src/components/compose.jsx:1280 718 718 #: src/components/status.jsx:100 719 719 #: src/components/status.jsx:2032 720 720 msgid "Private mention" 721 721 msgstr "" 722 722 723 - #: src/components/compose.jsx:1287 723 + #: src/components/compose.jsx:1289 724 724 msgid "Post your reply" 725 725 msgstr "Post your reply" 726 726 727 - #: src/components/compose.jsx:1289 727 + #: src/components/compose.jsx:1291 728 728 msgid "Edit your post" 729 729 msgstr "Edit your post" 730 730 731 - #: src/components/compose.jsx:1290 731 + #: src/components/compose.jsx:1292 732 732 msgid "What are you doing?" 733 733 msgstr "What are you doing?" 734 734 735 - #: src/components/compose.jsx:1368 735 + #: src/components/compose.jsx:1370 736 736 msgid "Mark media as sensitive" 737 737 msgstr "" 738 738 739 - #: src/components/compose.jsx:1405 739 + #: src/components/compose.jsx:1407 740 740 msgid "Posting on <0/>" 741 741 msgstr "Posting on <0/>" 742 742 743 - #: src/components/compose.jsx:1436 744 - #: src/components/compose.jsx:3260 743 + #: src/components/compose.jsx:1438 744 + #: src/components/compose.jsx:3265 745 745 #: src/components/shortcuts-settings.jsx:715 746 746 #: src/pages/list.jsx:362 747 747 msgid "Add" 748 748 msgstr "" 749 749 750 - #: src/components/compose.jsx:1662 750 + #: src/components/compose.jsx:1664 751 751 msgid "Schedule" 752 752 msgstr "Schedule" 753 753 754 - #: src/components/compose.jsx:1664 754 + #: src/components/compose.jsx:1666 755 755 #: src/components/keyboard-shortcuts-help.jsx:155 756 756 #: src/components/status.jsx:1025 757 757 #: src/components/status.jsx:1806 ··· 760 760 msgid "Reply" 761 761 msgstr "" 762 762 763 - #: src/components/compose.jsx:1666 763 + #: src/components/compose.jsx:1668 764 764 msgid "Update" 765 765 msgstr "Update" 766 766 767 - #: src/components/compose.jsx:1667 767 + #: src/components/compose.jsx:1669 768 768 msgctxt "Submit button in composer" 769 769 msgid "Post" 770 770 msgstr "Post" 771 771 772 - #: src/components/compose.jsx:1789 772 + #: src/components/compose.jsx:1791 773 773 msgid "Downloading GIF…" 774 774 msgstr "Downloading GIF…" 775 775 776 - #: src/components/compose.jsx:1817 776 + #: src/components/compose.jsx:1819 777 777 msgid "Failed to download GIF" 778 778 msgstr "Failed to download GIF" 779 779 780 - #: src/components/compose.jsx:2032 781 - #: src/components/compose.jsx:2109 780 + #: src/components/compose.jsx:2034 781 + #: src/components/compose.jsx:2111 782 782 #: src/components/nav-menu.jsx:239 783 783 msgid "More…" 784 784 msgstr "" 785 785 786 - #: src/components/compose.jsx:2541 786 + #: src/components/compose.jsx:2543 787 787 msgid "Uploaded" 788 788 msgstr "" 789 789 790 - #: src/components/compose.jsx:2554 790 + #: src/components/compose.jsx:2556 791 791 msgid "Image description" 792 792 msgstr "Image description" 793 793 794 - #: src/components/compose.jsx:2555 794 + #: src/components/compose.jsx:2557 795 795 msgid "Video description" 796 796 msgstr "Video description" 797 797 798 - #: src/components/compose.jsx:2556 798 + #: src/components/compose.jsx:2558 799 799 msgid "Audio description" 800 800 msgstr "Audio description" 801 801 ··· 803 803 #. placeholder {0}: prettyBytes( videoSize, ) 804 804 #. placeholder {1}: prettyBytes(imageSizeLimit) 805 805 #. placeholder {1}: prettyBytes(videoSizeLimit) 806 - #: src/components/compose.jsx:2592 807 - #: src/components/compose.jsx:2612 806 + #: src/components/compose.jsx:2594 807 + #: src/components/compose.jsx:2614 808 808 msgid "File size too large. Uploading might encounter issues. Try reduce the file size from {0} to {1} or lower." 809 809 msgstr "File size too large. Uploading might encounter issues. Try reduce the file size from {0} to {1} or lower." 810 810 ··· 812 812 #. placeholder {1}: i18n.number(height) 813 813 #. placeholder {2}: i18n.number(newWidth) 814 814 #. placeholder {3}: i18n.number( newHeight, ) 815 - #: src/components/compose.jsx:2604 816 - #: src/components/compose.jsx:2624 815 + #: src/components/compose.jsx:2606 816 + #: src/components/compose.jsx:2626 817 817 msgid "Dimension too large. Uploading might encounter issues. Try reduce dimension from {0}×{1}px to {2}×{3}px." 818 818 msgstr "Dimension too large. Uploading might encounter issues. Try reduce dimension from {0}×{1}px to {2}×{3}px." 819 819 820 - #: src/components/compose.jsx:2632 820 + #: src/components/compose.jsx:2634 821 821 msgid "Frame rate too high. Uploading might encounter issues." 822 822 msgstr "Frame rate too high. Uploading might encounter issues." 823 823 824 - #: src/components/compose.jsx:2692 825 - #: src/components/compose.jsx:2942 824 + #: src/components/compose.jsx:2694 825 + #: src/components/compose.jsx:2944 826 826 #: src/components/shortcuts-settings.jsx:726 827 - #: src/pages/catchup.jsx:1080 827 + #: src/pages/catchup.jsx:1081 828 828 #: src/pages/filters.jsx:413 829 829 msgid "Remove" 830 830 msgstr "" 831 831 832 - #: src/components/compose.jsx:2709 832 + #: src/components/compose.jsx:2711 833 833 #: src/compose.jsx:84 834 834 msgid "Error" 835 835 msgstr "" 836 836 837 - #: src/components/compose.jsx:2734 837 + #: src/components/compose.jsx:2736 838 838 msgid "Edit image description" 839 839 msgstr "Edit image description" 840 840 841 - #: src/components/compose.jsx:2735 841 + #: src/components/compose.jsx:2737 842 842 msgid "Edit video description" 843 843 msgstr "Edit video description" 844 844 845 - #: src/components/compose.jsx:2736 845 + #: src/components/compose.jsx:2738 846 846 msgid "Edit audio description" 847 847 msgstr "Edit audio description" 848 848 849 - #: src/components/compose.jsx:2781 850 - #: src/components/compose.jsx:2830 849 + #: src/components/compose.jsx:2783 850 + #: src/components/compose.jsx:2832 851 851 msgid "Generating description. Please wait…" 852 852 msgstr "Generating description. Please wait…" 853 853 854 854 #. placeholder {0}: e.message 855 - #: src/components/compose.jsx:2801 855 + #: src/components/compose.jsx:2803 856 856 msgid "Failed to generate description: {0}" 857 857 msgstr "Failed to generate description: {0}" 858 858 859 - #: src/components/compose.jsx:2802 859 + #: src/components/compose.jsx:2804 860 860 msgid "Failed to generate description" 861 861 msgstr "Failed to generate description" 862 862 863 - #: src/components/compose.jsx:2814 864 - #: src/components/compose.jsx:2820 865 - #: src/components/compose.jsx:2866 863 + #: src/components/compose.jsx:2816 864 + #: src/components/compose.jsx:2822 865 + #: src/components/compose.jsx:2868 866 866 msgid "Generate description…" 867 867 msgstr "" 868 868 869 869 #. placeholder {0}: e?.message ? `: ${e.message}` : '' 870 - #: src/components/compose.jsx:2853 870 + #: src/components/compose.jsx:2855 871 871 msgid "Failed to generate description{0}" 872 872 msgstr "Failed to generate description{0}" 873 873 874 874 #. placeholder {0}: localeCode2Text(lang) 875 - #: src/components/compose.jsx:2868 875 + #: src/components/compose.jsx:2870 876 876 msgid "({0}) <0>— experimental</0>" 877 877 msgstr "" 878 878 879 - #: src/components/compose.jsx:2887 879 + #: src/components/compose.jsx:2889 880 880 msgid "Done" 881 881 msgstr "" 882 882 883 883 #. placeholder {0}: i + 1 884 - #: src/components/compose.jsx:2923 884 + #: src/components/compose.jsx:2925 885 885 msgid "Choice {0}" 886 886 msgstr "Choice {0}" 887 887 888 - #: src/components/compose.jsx:2970 888 + #: src/components/compose.jsx:2972 889 889 msgid "Multiple choices" 890 890 msgstr "" 891 891 892 - #: src/components/compose.jsx:2973 892 + #: src/components/compose.jsx:2975 893 893 msgid "Duration" 894 894 msgstr "" 895 895 896 - #: src/components/compose.jsx:3004 896 + #: src/components/compose.jsx:3006 897 897 msgid "Remove poll" 898 898 msgstr "" 899 899 900 - #: src/components/compose.jsx:3219 900 + #: src/components/compose.jsx:3224 901 901 msgid "Search accounts" 902 902 msgstr "Search accounts" 903 903 904 - #: src/components/compose.jsx:3273 904 + #: src/components/compose.jsx:3278 905 905 #: src/components/generic-accounts.jsx:228 906 906 msgid "Error loading accounts" 907 907 msgstr "" 908 908 909 - #: src/components/compose.jsx:3417 909 + #: src/components/compose.jsx:3422 910 910 msgid "Custom emojis" 911 911 msgstr "" 912 912 913 - #: src/components/compose.jsx:3437 913 + #: src/components/compose.jsx:3442 914 914 msgid "Search emoji" 915 915 msgstr "Search emoji" 916 916 917 - #: src/components/compose.jsx:3468 917 + #: src/components/compose.jsx:3473 918 918 msgid "Error loading custom emojis" 919 919 msgstr "" 920 920 921 - #: src/components/compose.jsx:3479 921 + #: src/components/compose.jsx:3484 922 922 msgid "Recently used" 923 923 msgstr "Recently used" 924 924 925 - #: src/components/compose.jsx:3480 925 + #: src/components/compose.jsx:3485 926 926 msgid "Others" 927 927 msgstr "Others" 928 928 929 929 #. placeholder {0}: i18n.number(emojis.length - max) 930 - #: src/components/compose.jsx:3518 930 + #: src/components/compose.jsx:3523 931 931 msgid "{0} more…" 932 932 msgstr "" 933 933 934 - #: src/components/compose.jsx:3656 934 + #: src/components/compose.jsx:3661 935 935 msgid "Search GIFs" 936 936 msgstr "Search GIFs" 937 937 938 - #: src/components/compose.jsx:3671 938 + #: src/components/compose.jsx:3676 939 939 msgid "Powered by GIPHY" 940 940 msgstr "Powered by GIPHY" 941 941 942 - #: src/components/compose.jsx:3679 942 + #: src/components/compose.jsx:3684 943 943 msgid "Type to search GIFs" 944 944 msgstr "" 945 945 946 - #: src/components/compose.jsx:3777 947 - #: src/components/media-modal.jsx:464 948 - #: src/components/timeline.jsx:921 946 + #: src/components/compose.jsx:3782 947 + #: src/components/media-modal.jsx:465 948 + #: src/components/timeline.jsx:923 949 949 msgid "Previous" 950 950 msgstr "" 951 951 952 - #: src/components/compose.jsx:3795 953 - #: src/components/media-modal.jsx:483 954 - #: src/components/timeline.jsx:938 952 + #: src/components/compose.jsx:3800 953 + #: src/components/media-modal.jsx:484 954 + #: src/components/timeline.jsx:940 955 955 msgid "Next" 956 956 msgstr "" 957 957 958 - #: src/components/compose.jsx:3812 958 + #: src/components/compose.jsx:3817 959 959 msgid "Error loading GIFs" 960 960 msgstr "" 961 961 ··· 1005 1005 msgstr "" 1006 1006 1007 1007 #: src/components/drafts.jsx:247 1008 - #: src/pages/catchup.jsx:1933 1008 + #: src/pages/catchup.jsx:1934 1009 1009 msgid "Poll" 1010 1010 msgstr "" 1011 1011 ··· 1045 1045 msgstr "" 1046 1046 1047 1047 #: src/components/generic-accounts.jsx:206 1048 - #: src/components/timeline.jsx:545 1048 + #: src/components/timeline.jsx:547 1049 1049 #: src/pages/list.jsx:295 1050 1050 #: src/pages/notifications.jsx:914 1051 1051 #: src/pages/search.jsx:558 1052 - #: src/pages/status.jsx:1352 1052 + #: src/pages/status.jsx:1359 1053 1053 msgid "Show more…" 1054 1054 msgstr "" 1055 1055 1056 1056 #: src/components/generic-accounts.jsx:211 1057 - #: src/components/timeline.jsx:550 1057 + #: src/components/timeline.jsx:552 1058 1058 #: src/pages/search.jsx:563 1059 1059 msgid "The end." 1060 1060 msgstr "" ··· 1065 1065 1066 1066 #: src/components/keyboard-shortcuts-help.jsx:47 1067 1067 #: src/components/nav-menu.jsx:363 1068 - #: src/pages/catchup.jsx:1621 1068 + #: src/pages/catchup.jsx:1622 1069 1069 msgid "Keyboard shortcuts" 1070 1070 msgstr "" 1071 1071 ··· 1074 1074 msgstr "" 1075 1075 1076 1076 #: src/components/keyboard-shortcuts-help.jsx:59 1077 - #: src/pages/catchup.jsx:1646 1077 + #: src/pages/catchup.jsx:1647 1078 1078 msgid "Next post" 1079 1079 msgstr "" 1080 1080 1081 1081 #: src/components/keyboard-shortcuts-help.jsx:63 1082 - #: src/pages/catchup.jsx:1654 1082 + #: src/pages/catchup.jsx:1655 1083 1083 msgid "Previous post" 1084 1084 msgstr "" 1085 1085 ··· 1104 1104 msgstr "" 1105 1105 1106 1106 #: src/components/keyboard-shortcuts-help.jsx:87 1107 - #: src/pages/catchup.jsx:1678 1107 + #: src/pages/catchup.jsx:1679 1108 1108 msgid "Open post details" 1109 1109 msgstr "" 1110 1110 ··· 1271 1271 msgid "Speak" 1272 1272 msgstr "" 1273 1273 1274 - #: src/components/media-modal.jsx:369 1274 + #: src/components/media-modal.jsx:370 1275 1275 msgid "Open original media in new window" 1276 1276 msgstr "" 1277 1277 1278 - #: src/components/media-modal.jsx:373 1278 + #: src/components/media-modal.jsx:374 1279 1279 msgid "Open original media" 1280 1280 msgstr "" 1281 1281 1282 - #: src/components/media-modal.jsx:389 1282 + #: src/components/media-modal.jsx:390 1283 1283 msgid "Attempting to describe image. Please wait…" 1284 1284 msgstr "" 1285 1285 1286 - #: src/components/media-modal.jsx:404 1286 + #: src/components/media-modal.jsx:405 1287 1287 msgid "Failed to describe image" 1288 1288 msgstr "" 1289 1289 1290 - #: src/components/media-modal.jsx:414 1290 + #: src/components/media-modal.jsx:415 1291 1291 msgid "Describe image…" 1292 1292 msgstr "" 1293 1293 1294 - #: src/components/media-modal.jsx:438 1294 + #: src/components/media-modal.jsx:439 1295 1295 msgid "View post" 1296 1296 msgstr "" 1297 1297 ··· 1307 1307 #: src/components/status.jsx:3662 1308 1308 #: src/components/status.jsx:3758 1309 1309 #: src/components/status.jsx:3836 1310 - #: src/components/timeline.jsx:1006 1310 + #: src/components/timeline.jsx:1008 1311 1311 #: src/pages/catchup.jsx:76 1312 - #: src/pages/catchup.jsx:1881 1312 + #: src/pages/catchup.jsx:1882 1313 1313 msgid "Filtered" 1314 1314 msgstr "" 1315 1315 ··· 1358 1358 msgstr "Following" 1359 1359 1360 1360 #: src/components/nav-menu.jsx:192 1361 - #: src/pages/catchup.jsx:877 1361 + #: src/pages/catchup.jsx:878 1362 1362 msgid "Catch-up" 1363 1363 msgstr "" 1364 1364 ··· 1403 1403 #: src/components/nav-menu.jsx:248 1404 1404 #: src/components/shortcuts-settings.jsx:55 1405 1405 #: src/components/shortcuts-settings.jsx:201 1406 - #: src/pages/catchup.jsx:1448 1407 - #: src/pages/catchup.jsx:2068 1406 + #: src/pages/catchup.jsx:1449 1407 + #: src/pages/catchup.jsx:2069 1408 1408 #: src/pages/favourites.jsx:12 1409 1409 #: src/pages/favourites.jsx:24 1410 1410 #: src/pages/settings.jsx:1155 ··· 1448 1448 #: src/components/nav-menu.jsx:321 1449 1449 #: src/pages/login.jsx:27 1450 1450 #: src/pages/login.jsx:190 1451 - #: src/pages/status.jsx:855 1451 + #: src/pages/status.jsx:862 1452 1452 #: src/pages/welcome.jsx:65 1453 1453 msgid "Log in" 1454 1454 msgstr "" ··· 1670 1670 #: src/components/poll.jsx:208 1671 1671 #: src/components/poll.jsx:210 1672 1672 #: src/pages/scheduled-posts.jsx:98 1673 - #: src/pages/status.jsx:1221 1674 - #: src/pages/status.jsx:1244 1673 + #: src/pages/status.jsx:1228 1674 + #: src/pages/status.jsx:1251 1675 1675 msgid "Refresh" 1676 1676 msgstr "" 1677 1677 ··· 2372 2372 #. placeholder {0}: filterInfo.titlesStr 2373 2373 #. placeholder {0}: filterInfo?.titlesStr 2374 2374 #: src/components/status.jsx:2272 2375 - #: src/pages/catchup.jsx:1880 2375 + #: src/pages/catchup.jsx:1881 2376 2376 msgid "Filtered: {0}" 2377 2377 msgstr "Filtered: {0}" 2378 2378 ··· 2468 2468 msgid "<0/> <1/> boosted" 2469 2469 msgstr "" 2470 2470 2471 - #: src/components/timeline.jsx:479 2471 + #: src/components/timeline.jsx:481 2472 2472 #: src/pages/settings.jsx:1179 2473 2473 msgid "New posts" 2474 2474 msgstr "" 2475 2475 2476 - #: src/components/timeline.jsx:580 2476 + #: src/components/timeline.jsx:582 2477 2477 #: src/pages/home.jsx:216 2478 2478 #: src/pages/notifications.jsx:890 2479 - #: src/pages/status.jsx:1008 2480 - #: src/pages/status.jsx:1381 2479 + #: src/pages/status.jsx:1015 2480 + #: src/pages/status.jsx:1388 2481 2481 msgid "Try again" 2482 2482 msgstr "" 2483 2483 2484 2484 #. placeholder {0}: fItems.length 2485 - #: src/components/timeline.jsx:615 2485 + #: src/components/timeline.jsx:617 2486 2486 msgid "{0, plural, one {# Boost} other {# Boosts}}" 2487 2487 msgstr "{0, plural, one {# Boost} other {# Boosts}}" 2488 2488 2489 - #: src/components/timeline.jsx:620 2489 + #: src/components/timeline.jsx:622 2490 2490 msgid "Pinned posts" 2491 2491 msgstr "Pinned posts" 2492 2492 2493 - #: src/components/timeline.jsx:979 2494 - #: src/components/timeline.jsx:986 2495 - #: src/pages/catchup.jsx:1898 2493 + #: src/components/timeline.jsx:981 2494 + #: src/components/timeline.jsx:988 2495 + #: src/pages/catchup.jsx:1899 2496 2496 msgid "Thread" 2497 2497 msgstr "" 2498 2498 2499 2499 #. placeholder {0}: filterInfo.titlesStr 2500 - #: src/components/timeline.jsx:1001 2500 + #: src/components/timeline.jsx:1003 2501 2501 msgid "<0>Filtered</0>: <1>{0}</1>" 2502 2502 msgstr "" 2503 2503 ··· 2757 2757 msgid "Showing {selectedFilterCategory, select, all {all posts} original {original posts} replies {replies} boosts {boosts} followedTags {followed tags} groups {groups} filtered {filtered posts}}, {sortBy, select, createdAt {{sortOrder, select, asc {oldest} desc {latest}}} reblogsCount {{sortOrder, select, asc {fewest boosts} desc {most boosts}}} favouritesCount {{sortOrder, select, asc {fewest likes} desc {most likes}}} repliesCount {{sortOrder, select, asc {fewest replies} desc {most replies}}} density {{sortOrder, select, asc {least dense} desc {most dense}}}} first{groupBy, select, account {, grouped by authors} other {}}" 2758 2758 msgstr "Showing {selectedFilterCategory, select, all {all posts} original {original posts} replies {replies} boosts {boosts} followedTags {followed tags} groups {groups} filtered {filtered posts}}, {sortBy, select, createdAt {{sortOrder, select, asc {oldest} desc {latest}}} reblogsCount {{sortOrder, select, asc {fewest boosts} desc {most boosts}}} favouritesCount {{sortOrder, select, asc {fewest likes} desc {most likes}}} repliesCount {{sortOrder, select, asc {fewest replies} desc {most replies}}} density {{sortOrder, select, asc {least dense} desc {most dense}}}} first{groupBy, select, account {, grouped by authors} other {}}" 2759 2759 2760 - #: src/pages/catchup.jsx:888 2761 - #: src/pages/catchup.jsx:912 2760 + #: src/pages/catchup.jsx:889 2761 + #: src/pages/catchup.jsx:913 2762 2762 msgid "Catch-up <0>beta</0>" 2763 2763 msgstr "" 2764 2764 2765 - #: src/pages/catchup.jsx:902 2766 - #: src/pages/catchup.jsx:1587 2765 + #: src/pages/catchup.jsx:903 2766 + #: src/pages/catchup.jsx:1588 2767 2767 msgid "Help" 2768 2768 msgstr "" 2769 2769 2770 - #: src/pages/catchup.jsx:918 2770 + #: src/pages/catchup.jsx:919 2771 2771 msgid "What is this?" 2772 2772 msgstr "" 2773 2773 2774 - #: src/pages/catchup.jsx:921 2774 + #: src/pages/catchup.jsx:922 2775 2775 msgid "Catch-up is a separate timeline for your followings, offering a high-level view at a glance, with a simple, email-inspired interface to effortlessly sort and filter through posts." 2776 2776 msgstr "" 2777 2777 2778 - #: src/pages/catchup.jsx:932 2778 + #: src/pages/catchup.jsx:933 2779 2779 msgid "Preview of Catch-up UI" 2780 2780 msgstr "Preview of Catch-up UI" 2781 2781 2782 - #: src/pages/catchup.jsx:941 2782 + #: src/pages/catchup.jsx:942 2783 2783 msgid "Let's catch up" 2784 2784 msgstr "" 2785 2785 2786 - #: src/pages/catchup.jsx:946 2786 + #: src/pages/catchup.jsx:947 2787 2787 msgid "Let's catch up on the posts from your followings." 2788 2788 msgstr "" 2789 2789 2790 - #: src/pages/catchup.jsx:950 2790 + #: src/pages/catchup.jsx:951 2791 2791 msgid "Show me all posts from…" 2792 2792 msgstr "" 2793 2793 2794 - #: src/pages/catchup.jsx:973 2794 + #: src/pages/catchup.jsx:974 2795 2795 msgid "until the max" 2796 2796 msgstr "until the max" 2797 2797 2798 - #: src/pages/catchup.jsx:1003 2798 + #: src/pages/catchup.jsx:1004 2799 2799 msgid "Catch up" 2800 2800 msgstr "" 2801 2801 2802 - #: src/pages/catchup.jsx:1009 2802 + #: src/pages/catchup.jsx:1010 2803 2803 msgid "Overlaps with your last catch-up" 2804 2804 msgstr "" 2805 2805 2806 2806 #. placeholder {0}: dtf.format(new Date(lastCatchupEndAt)) 2807 - #: src/pages/catchup.jsx:1021 2807 + #: src/pages/catchup.jsx:1022 2808 2808 msgid "Until the last catch-up ({0})" 2809 2809 msgstr "" 2810 2810 2811 - #: src/pages/catchup.jsx:1030 2811 + #: src/pages/catchup.jsx:1031 2812 2812 msgid "Note: your instance might only show a maximum of 800 posts in the Home timeline regardless of the time range. Could be less or more." 2813 2813 msgstr "" 2814 2814 2815 - #: src/pages/catchup.jsx:1040 2815 + #: src/pages/catchup.jsx:1041 2816 2816 msgid "Previously…" 2817 2817 msgstr "" 2818 2818 2819 2819 #. placeholder {0}: pc.count 2820 - #: src/pages/catchup.jsx:1058 2820 + #: src/pages/catchup.jsx:1059 2821 2821 msgid "{0, plural, one {# post} other {# posts}}" 2822 2822 msgstr "" 2823 2823 2824 - #: src/pages/catchup.jsx:1068 2824 + #: src/pages/catchup.jsx:1069 2825 2825 msgid "Remove this catch-up?" 2826 2826 msgstr "Remove this catch-up?" 2827 2827 2828 2828 #. placeholder {0}: pc.id 2829 - #: src/pages/catchup.jsx:1071 2829 + #: src/pages/catchup.jsx:1072 2830 2830 msgid "Removing Catch-up {0}" 2831 2831 msgstr "Removing Catch-up {0}" 2832 2832 2833 2833 #. placeholder {0}: pc.id 2834 - #: src/pages/catchup.jsx:1075 2834 + #: src/pages/catchup.jsx:1076 2835 2835 msgid "Catch-up {0} removed" 2836 2836 msgstr "Catch-up {0} removed" 2837 2837 2838 - #: src/pages/catchup.jsx:1089 2838 + #: src/pages/catchup.jsx:1090 2839 2839 msgid "Note: Only max 3 will be stored. The rest will be automatically removed." 2840 2840 msgstr "" 2841 2841 2842 - #: src/pages/catchup.jsx:1104 2842 + #: src/pages/catchup.jsx:1105 2843 2843 msgid "Fetching posts…" 2844 2844 msgstr "" 2845 2845 2846 - #: src/pages/catchup.jsx:1107 2846 + #: src/pages/catchup.jsx:1108 2847 2847 msgid "This might take a while." 2848 2848 msgstr "" 2849 2849 2850 - #: src/pages/catchup.jsx:1142 2850 + #: src/pages/catchup.jsx:1143 2851 2851 msgid "Reset filters" 2852 2852 msgstr "" 2853 2853 2854 - #: src/pages/catchup.jsx:1150 2855 - #: src/pages/catchup.jsx:1593 2854 + #: src/pages/catchup.jsx:1151 2855 + #: src/pages/catchup.jsx:1594 2856 2856 msgid "Top links" 2857 2857 msgstr "" 2858 2858 2859 2859 #. placeholder {0}: sharers.map((s) => { const { avatarStatic, displayName } = s; return ( <button type="button" class="plain" style={{ padding: 0, }} onClick={(e) => { e.preventDefault(); e.stopPropagation(); // Reset and filter to author const { id } = s; setSelectedAuthor(id); setSelectedFilterCategory('all'); }} > <Avatar url={avatarStatic} size="s" alt={displayName} /> </button> ); }) 2860 - #: src/pages/catchup.jsx:1263 2860 + #: src/pages/catchup.jsx:1264 2861 2861 msgid "Shared by {0}" 2862 2862 msgstr "" 2863 2863 2864 - #: src/pages/catchup.jsx:1318 2864 + #: src/pages/catchup.jsx:1319 2865 2865 #: src/pages/mentions.jsx:148 2866 2866 #: src/pages/search.jsx:326 2867 2867 msgid "All" 2868 2868 msgstr "" 2869 2869 2870 2870 #. placeholder {0}: authorCountsList.length 2871 - #: src/pages/catchup.jsx:1403 2871 + #: src/pages/catchup.jsx:1404 2872 2872 msgid "{0, plural, one {# author} other {# authors}}" 2873 2873 msgstr "" 2874 2874 2875 - #: src/pages/catchup.jsx:1415 2875 + #: src/pages/catchup.jsx:1416 2876 2876 msgid "Sort" 2877 2877 msgstr "" 2878 2878 2879 - #: src/pages/catchup.jsx:1446 2879 + #: src/pages/catchup.jsx:1447 2880 2880 msgid "Date" 2881 2881 msgstr "Date" 2882 2882 2883 - #: src/pages/catchup.jsx:1450 2883 + #: src/pages/catchup.jsx:1451 2884 2884 msgid "Density" 2885 2885 msgstr "Density" 2886 2886 2887 2887 #. js-lingui-explicit-id 2888 - #: src/pages/catchup.jsx:1473 2888 + #: src/pages/catchup.jsx:1474 2889 2889 msgid "group.filter" 2890 2890 msgstr "Group" 2891 2891 2892 - #: src/pages/catchup.jsx:1488 2892 + #: src/pages/catchup.jsx:1489 2893 2893 msgid "Authors" 2894 2894 msgstr "Authors" 2895 2895 2896 - #: src/pages/catchup.jsx:1489 2896 + #: src/pages/catchup.jsx:1490 2897 2897 msgid "None" 2898 2898 msgstr "None" 2899 2899 2900 - #: src/pages/catchup.jsx:1505 2900 + #: src/pages/catchup.jsx:1506 2901 2901 msgid "Show all authors" 2902 2902 msgstr "" 2903 2903 2904 - #: src/pages/catchup.jsx:1556 2904 + #: src/pages/catchup.jsx:1557 2905 2905 msgid "You don't have to read everything." 2906 2906 msgstr "You don't have to read everything." 2907 2907 2908 - #: src/pages/catchup.jsx:1557 2908 + #: src/pages/catchup.jsx:1558 2909 2909 msgid "That's all." 2910 2910 msgstr "That's all." 2911 2911 2912 - #: src/pages/catchup.jsx:1565 2912 + #: src/pages/catchup.jsx:1566 2913 2913 msgid "Back to top" 2914 2914 msgstr "" 2915 2915 2916 - #: src/pages/catchup.jsx:1596 2916 + #: src/pages/catchup.jsx:1597 2917 2917 msgid "Links shared by followings, sorted by shared counts, boosts and likes." 2918 2918 msgstr "" 2919 2919 2920 - #: src/pages/catchup.jsx:1602 2920 + #: src/pages/catchup.jsx:1603 2921 2921 msgid "Sort: Density" 2922 2922 msgstr "" 2923 2923 2924 - #: src/pages/catchup.jsx:1605 2924 + #: src/pages/catchup.jsx:1606 2925 2925 msgid "Posts are sorted by information density or depth. Shorter posts are \"lighter\" while longer posts are \"heavier\". Posts with photos are \"heavier\" than posts without photos." 2926 2926 msgstr "" 2927 2927 2928 - #: src/pages/catchup.jsx:1612 2928 + #: src/pages/catchup.jsx:1613 2929 2929 msgid "Group: Authors" 2930 2930 msgstr "" 2931 2931 2932 - #: src/pages/catchup.jsx:1615 2932 + #: src/pages/catchup.jsx:1616 2933 2933 msgid "Posts are grouped by authors, sorted by posts count per author." 2934 2934 msgstr "" 2935 2935 2936 - #: src/pages/catchup.jsx:1662 2936 + #: src/pages/catchup.jsx:1663 2937 2937 msgid "Next author" 2938 2938 msgstr "" 2939 2939 2940 - #: src/pages/catchup.jsx:1670 2940 + #: src/pages/catchup.jsx:1671 2941 2941 msgid "Previous author" 2942 2942 msgstr "" 2943 2943 2944 - #: src/pages/catchup.jsx:1686 2944 + #: src/pages/catchup.jsx:1687 2945 2945 msgid "Scroll to top" 2946 2946 msgstr "" 2947 2947 ··· 3802 3802 3803 3803 #. js-lingui-explicit-id 3804 3804 #: src/pages/status.jsx:599 3805 - #: src/pages/status.jsx:1151 3805 + #: src/pages/status.jsx:1158 3806 3806 msgid "post.title" 3807 3807 msgstr "Post" 3808 3808 3809 - #: src/pages/status.jsx:842 3809 + #: src/pages/status.jsx:849 3810 3810 msgid "You're not logged in. Interactions (reply, boost, etc) are not possible." 3811 3811 msgstr "" 3812 3812 3813 - #: src/pages/status.jsx:862 3813 + #: src/pages/status.jsx:869 3814 3814 msgid "This post is from another instance (<0>{instance}</0>). Interactions (reply, boost, etc) are not possible." 3815 3815 msgstr "" 3816 3816 3817 - #: src/pages/status.jsx:890 3817 + #: src/pages/status.jsx:897 3818 3818 msgid "Error: {e}" 3819 3819 msgstr "" 3820 3820 3821 - #: src/pages/status.jsx:897 3821 + #: src/pages/status.jsx:904 3822 3822 msgid "Switch to my instance to enable interactions" 3823 3823 msgstr "" 3824 3824 3825 - #: src/pages/status.jsx:999 3825 + #: src/pages/status.jsx:1006 3826 3826 msgid "Unable to load replies." 3827 3827 msgstr "" 3828 3828 3829 - #: src/pages/status.jsx:1111 3829 + #: src/pages/status.jsx:1118 3830 3830 msgid "Back" 3831 3831 msgstr "" 3832 3832 3833 - #: src/pages/status.jsx:1142 3833 + #: src/pages/status.jsx:1149 3834 3834 msgid "Go to main post" 3835 3835 msgstr "" 3836 3836 3837 3837 #. placeholder {0}: ancestors.length 3838 - #: src/pages/status.jsx:1165 3838 + #: src/pages/status.jsx:1172 3839 3839 msgid "{0} posts above ‒ Go to top" 3840 3840 msgstr "" 3841 3841 3842 - #: src/pages/status.jsx:1208 3843 - #: src/pages/status.jsx:1271 3842 + #: src/pages/status.jsx:1215 3843 + #: src/pages/status.jsx:1278 3844 3844 msgid "Switch to Side Peek view" 3845 3845 msgstr "" 3846 3846 3847 - #: src/pages/status.jsx:1272 3847 + #: src/pages/status.jsx:1279 3848 3848 msgid "Switch to Full view" 3849 3849 msgstr "" 3850 3850 3851 - #: src/pages/status.jsx:1290 3851 + #: src/pages/status.jsx:1297 3852 3852 msgid "Show all sensitive content" 3853 3853 msgstr "" 3854 3854 3855 - #: src/pages/status.jsx:1295 3855 + #: src/pages/status.jsx:1302 3856 3856 msgid "Experimental" 3857 3857 msgstr "" 3858 3858 3859 - #: src/pages/status.jsx:1304 3859 + #: src/pages/status.jsx:1311 3860 3860 msgid "Unable to switch" 3861 3861 msgstr "" 3862 3862 3863 3863 #. placeholder {0}: punycode.toUnicode( postInstance, ) 3864 - #: src/pages/status.jsx:1311 3864 + #: src/pages/status.jsx:1318 3865 3865 msgid "Switch to post's instance ({0})" 3866 3866 msgstr "Switch to post's instance ({0})" 3867 3867 3868 - #: src/pages/status.jsx:1314 3868 + #: src/pages/status.jsx:1321 3869 3869 msgid "Switch to post's instance" 3870 3870 msgstr "" 3871 3871 3872 - #: src/pages/status.jsx:1372 3872 + #: src/pages/status.jsx:1379 3873 3873 msgid "Unable to load post" 3874 3874 msgstr "" 3875 3875 3876 3876 #. placeholder {0}: replies.length 3877 3877 #. placeholder {1}: shortenNumber(replies.length) 3878 - #: src/pages/status.jsx:1508 3878 + #: src/pages/status.jsx:1515 3879 3879 msgid "{0, plural, one {# reply} other {<0>{1}</0> replies}}" 3880 3880 msgstr "" 3881 3881 3882 3882 #. placeholder {0}: shortenNumber(totalComments) 3883 - #: src/pages/status.jsx:1526 3883 + #: src/pages/status.jsx:1533 3884 3884 msgid "{totalComments, plural, one {# comment} other {<0>{0}</0> comments}}" 3885 3885 msgstr "" 3886 3886 3887 - #: src/pages/status.jsx:1548 3887 + #: src/pages/status.jsx:1555 3888 3888 msgid "View post with its replies" 3889 3889 msgstr "" 3890 3890
+1
src/pages/catchup.jsx
··· 808 808 preventDefault: true, 809 809 ignoreModifiers: true, 810 810 enableOnFormTags: ['input'], 811 + useKey: true, 811 812 }, 812 813 ); 813 814
+10 -3
src/pages/status.jsx
··· 644 644 const hasModal = !!document.querySelector('#modal-container > *'); 645 645 return hasModal; 646 646 }, 647 + useKey: true, 647 648 }, 648 649 ); 649 650 // For backspace, will always close both media and status page 650 - useHotkeys('backspace', () => { 651 - location.hash = closeLink; 652 - }); 651 + useHotkeys( 652 + 'backspace', 653 + () => { 654 + location.hash = closeLink; 655 + }, 656 + { 657 + useKey: true, 658 + }, 659 + ); 653 660 654 661 useHotkeys( 655 662 'j',