From 8ca9bb1dfa9e481b1c58ad15a4d3539b8716a9c2 Mon Sep 17 00:00:00 2001 From: Laura Gao Date: Sat, 29 Jul 2023 07:24:45 -0600 Subject: [PATCH 1/5] f/e/p/n shortcuts --- components/navbar.tsx | 6 ++++++ utils/hooks.ts | 26 ++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/components/navbar.tsx b/components/navbar.tsx index ec7970d..4d03427 100644 --- a/components/navbar.tsx +++ b/components/navbar.tsx @@ -14,6 +14,7 @@ import {IoMdExit} from "react-icons/io"; import SignInButton from "./SignInButton"; import FloatingCta from "./FloatingCTA"; import NavbarNotificationMenu from "./NavbarNotificationMenu"; +import {useKey} from "../utils/hooks"; export default function Navbar() { const router = useRouter(); @@ -36,6 +37,11 @@ export default function Navbar() { const {theme, setTheme} = useTheme(); + useKey("KeyF", () => {if (router.route !== "/") router.push("/")}) + useKey("KeyE", () => {if (router.route !== "/explore") router.push("/explore")}) + useKey("KeyP", () => {if (router.route !== "/profile" && session) router.push("/@" + data.data.urlName)}) + useKey("KeyN", () => {if (router.route !== "/new-update" && session) router.push("/new-update")}) + const NavbarDarkModeButton = () => ( + ) + })} + {/* Pagination bar */} +
+ {data.count > 10 && Array.from(Array(Math.ceil(data.count / 10)).keys()).map(n => + + )} +
+

+ Showing results {page * 10 + 1}-{(page * 10 + 10) < data.count ? (page * 10 + 10) : data.count} out of {data.count} +

+ + ) : (query.length ? ( +

No documents containing the given query were found.

+ ) : <>) : ( +
+ )} + + + ) +} + +const includesAQueryWord = (string: string, queryWords: string[]) => { + for (let word of queryWords) { + if (string.toLowerCase().includes(word.toLowerCase())) return true + } + return false +} + +const SearchNameH3 = ({ children, query }: { children: string, query: string }) => { + const queryWords = query.split(" ") + const nameWords = children.split(" ") + const newNameWords = nameWords.map(word => ( + includesAQueryWord(word, queryWords) + ? {word} + : {word} + )) + return ( +

{newNameWords.map((element, idx) => ( + idx === 0 + ? {element} + : {element} + ))}

+ ) +} + +const SearchBody = ({ update, query }: {update: Update, query: string}) => { + if (!update.body) return; + // s.body.substr(s.body.indexOf(query) - 50, 100) + const queryWords = query.split(" ") + const paragraphsArr = update.body.split(` +`) + const newParagraphs = paragraphsArr.filter(p => ( + includesAQueryWord(p, queryWords) + )).map(p => { + // Some really jank shit for bolding certain words + const paragraphWords = p.split(" ") + const newParagraphWords = paragraphWords.map(w => includesAQueryWord(w, queryWords) ? {w} : {w}) + // return newParagraphWords.join(" ") + return newParagraphWords + }) + return ( + // newParagraphs.map( (p, idx) =>
+        //     {p}
+        // 
) +
+ {newParagraphs.map((p, idx) =>

{ + p.map((f, id) => {f} ) + }

)} +
+ ) +} + + +export default QuickSwitcher \ No newline at end of file diff --git a/components/navbar.tsx b/components/navbar.tsx index 4d03427..137bd52 100644 --- a/components/navbar.tsx +++ b/components/navbar.tsx @@ -15,6 +15,10 @@ import SignInButton from "./SignInButton"; import FloatingCta from "./FloatingCTA"; import NavbarNotificationMenu from "./NavbarNotificationMenu"; import {useKey} from "../utils/hooks"; +import Mousetrap from "mousetrap"; +import 'mousetrap/plugins/global-bind/mousetrap-global-bind'; +import QuickSwitcher from "./QuickSwitcher"; + export default function Navbar() { const router = useRouter(); @@ -24,6 +28,7 @@ export default function Navbar() { const { data: notificationData, error: notificationsError }: responseInterface<{ notifications: RichNotif[] }, any> = useSWR(session ? `/api/get-notifications?iter=${notificationsIter}` : null, fetcher); const [ notifications, setNotifications ] = useState([]); const numNotifications = notifications.filter(d => !d.read).length + const [isQuickSwitcher, setIsQuickSwitcher] = useState(false); useEffect(() => { if (notificationData && notificationData.notifications) { @@ -42,6 +47,21 @@ export default function Navbar() { useKey("KeyP", () => {if (router.route !== "/profile" && session) router.push("/@" + data.data.urlName)}) useKey("KeyN", () => {if (router.route !== "/new-update" && session) router.push("/new-update")}) + useEffect(() => { + + function onQuickSwitcherShortcut(e) { + e.preventDefault(); + setIsQuickSwitcher(prev => !prev); + } + + Mousetrap.bindGlobal(['command+k', 'ctrl+k'], onQuickSwitcherShortcut); + + return () => { + Mousetrap.unbind(['command+k', 'ctrl+k'], onQuickSwitcherShortcut); + } + }); + + const NavbarDarkModeButton = () => ( + ) })} {/* Pagination bar */} diff --git a/pages/api/search.ts b/pages/api/search.ts index 8daa20c..c02bee5 100644 --- a/pages/api/search.ts +++ b/pages/api/search.ts @@ -20,7 +20,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) const matchingUpdates = await updateModel.aggregate([ {$match: {$or: [ {"body": {$regex: `.*${req.query.query}.*`, $options: "i"}}, - {"name": {$regex: `.*${req.query.query}.*`, $options: "i"}} + {"title": {$regex: `.*${req.query.query}.*`, $options: "i"}} ]}}, {$lookup: {from: "users", localField: "userId", foreignField: "_id", as: "user"}}, {$unwind: "$user"}, From 97123d15da6bdfb6472503f4cb3c633eda129258 Mon Sep 17 00:00:00 2001 From: Laura Gao Date: Tue, 1 Aug 2023 09:41:12 +0900 Subject: [PATCH 5/5] bump version --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index c30a759..14a7255 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "updately", - "version": "0.10.0", + "version": "0.11.1", "lockfileVersion": 2, "requires": true, "packages": { diff --git a/package.json b/package.json index 9521cba..f824556 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "updately", - "version": "0.10.0", + "version": "0.11.1", "private": true, "license": "BSD-3-Clause", "scripts": {