From 4492974ac6de21a8bd7dd869b7a46f6d78281340 Mon Sep 17 00:00:00 2001 From: "sir.kokabi" Date: Fri, 28 Jun 2024 15:22:26 +0330 Subject: [PATCH] add profile note feature --- src/contents/ProfileNote.tsx | 100 ++++++++++++++++++++++++++++++ src/contents/ProfileNoteAlert.tsx | 45 ++++++++++++++ src/storage.ts | 9 +++ src/utils.js | 21 ++++++- 4 files changed, 173 insertions(+), 2 deletions(-) create mode 100644 src/contents/ProfileNote.tsx create mode 100644 src/contents/ProfileNoteAlert.tsx diff --git a/src/contents/ProfileNote.tsx b/src/contents/ProfileNote.tsx new file mode 100644 index 0000000..7a1b1af --- /dev/null +++ b/src/contents/ProfileNote.tsx @@ -0,0 +1,100 @@ +import cssText from "data-text:~contents/styles.css"; +import type { PlasmoCSConfig, PlasmoGetInlineAnchor } from "plasmo"; +import React, { useState, useEffect, useCallback } from "react"; +import * as utils from "~utils"; + +export const config: PlasmoCSConfig = { + matches: ["https://twitter.com/*", "https://x.com/*"] +}; + +export const getInlineAnchor: PlasmoGetInlineAnchor = () => + document.querySelector(`div[data-testid='UserName'] > div > div`); + +export const getStyle = () => { + const style = document.createElement("style"); + style.textContent = cssText; + return style; +}; + +const ProfileNote = () => { + const [note, setNote] = useState(""); + const [originalNote, setOriginalNote] = useState(""); + const [isPersian, setIsPersian] = useState(false); + const [showToast, setShowToast] = useState(false); + const [remainingLength, setRemainingLength] = useState(120); + const username = window.location.toString().split('/').pop(); + + useEffect(() => { + utils.getProfileNote(username).then((value) => { + if (value !== undefined) { + setNote(value); + setOriginalNote(value); + setIsPersian(utils.isPersian(value)); + setRemainingLength(120 - value.length); + } + }); + }, [username]); + + const saveNote = useCallback(async () => { + if (note.trim() === '') await utils.deleteProfileNote(username); + else { + utils.saveProfileNote(username, note) + } + setShowToast(true); + setOriginalNote(note); + setTimeout(() => { + setShowToast(false); + }, 800); + + }, [note, username]); + + const handleChange = (e) => { + const newNote = e.target.value; + setNote(newNote); + setIsPersian(utils.isPersian(newNote)); + setRemainingLength(120 - newNote.length); + }; + + const handleKeyDown = (e) => { + if (e.key === "Enter") { + e.preventDefault(); + saveNote(); + } + }; + + const isNoteChanged = note !== originalNote; + + return ( +
+