diff --git a/package-lock.json b/package-lock.json index 1c43697..4b72923 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,17 +1,17 @@ { "name": "sky-follower-bridge", - "version": "0.9.8", + "version": "1.0.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "sky-follower-bridge", - "version": "0.9.8", + "version": "1.0.1", "dependencies": { "@atproto/api": "^0.13.12", "@changesets/cli": "^2.27.1", "@plasmohq/messaging": "^0.6.2", - "@plasmohq/storage": "^1.9.1", + "@plasmohq/storage": "^1.12.0", "framer-motion": "^11.11.11", "plasmo": "^0.84.2", "react": "18.2.0", @@ -7566,9 +7566,9 @@ } }, "node_modules/@plasmohq/storage": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@plasmohq/storage/-/storage-1.9.1.tgz", - "integrity": "sha512-65UXCZEWUA0aHhho2Mu5igrP/zdxkvPsT5N3rIypOYh0prn6Xk5HD0dt7q0mo8hb16QUUWDUL7OUPH4IDeDsIg==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/@plasmohq/storage/-/storage-1.12.0.tgz", + "integrity": "sha512-LoCyO0PXl609ee8QKVEwVpkTyD/8WjYQhd0sxFomLxbdxsZC0LD4n8nv4nSegP5X8lYQBQnR/LMq4ZXoQh87wA==", "dependencies": { "pify": "6.1.0" }, @@ -28126,9 +28126,9 @@ } }, "@plasmohq/storage": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@plasmohq/storage/-/storage-1.9.1.tgz", - "integrity": "sha512-65UXCZEWUA0aHhho2Mu5igrP/zdxkvPsT5N3rIypOYh0prn6Xk5HD0dt7q0mo8hb16QUUWDUL7OUPH4IDeDsIg==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/@plasmohq/storage/-/storage-1.12.0.tgz", + "integrity": "sha512-LoCyO0PXl609ee8QKVEwVpkTyD/8WjYQhd0sxFomLxbdxsZC0LD4n8nv4nSegP5X8lYQBQnR/LMq4ZXoQh87wA==", "requires": { "pify": "6.1.0" }, diff --git a/package.json b/package.json index 87d2592..10bf28c 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "sky-follower-bridge", "displayName": "Sky Follower Bridge", - "version": "1.0.0", + "version": "1.0.1", "description": "Instantly find and follow the same users from your Twitter follows on Bluesky.", "author": "kawamataryou", "scripts": { @@ -22,7 +22,7 @@ "@atproto/api": "^0.13.12", "@changesets/cli": "^2.27.1", "@plasmohq/messaging": "^0.6.2", - "@plasmohq/storage": "^1.9.1", + "@plasmohq/storage": "^1.12.0", "framer-motion": "^11.11.11", "plasmo": "^0.84.2", "react": "18.2.0", diff --git a/sky-follower-bridge-src.zip b/sky-follower-bridge-src.zip new file mode 100644 index 0000000..b7a0f58 Binary files /dev/null and b/sky-follower-bridge-src.zip differ diff --git a/src/lib/hooks/useBskyUserManager.ts b/src/lib/hooks/useBskyUserManager.ts index 3048703..a063f29 100644 --- a/src/lib/hooks/useBskyUserManager.ts +++ b/src/lib/hooks/useBskyUserManager.ts @@ -1,3 +1,5 @@ +import { useStorage } from "@plasmohq/storage/hook"; +import { Storage } from "@plasmohq/storage"; import React from "react"; import { BskyServiceWorkerClient } from "~lib/bskyServiceWorkerClient"; import { @@ -9,13 +11,15 @@ import { import { wait } from "~lib/utils"; import type { BskyUser, MatchType } from "~types"; -export const useBskyUserManager = ({ - users, - setUsers, -}: { - users: BskyUser[]; - setUsers: React.Dispatch>; -}) => { +export const useBskyUserManager = () => { + const [users, setUsers] = useStorage({ + key: STORAGE_KEYS.DETECTED_BSKY_USERS, + instance: new Storage({ + area: "local", + }), + }, + (v) => (v === undefined ? [] : v) + ); const bskyClient = React.useRef(null); const [actionMode, setActionMode] = React.useState< (typeof ACTION_MODE)[keyof typeof ACTION_MODE] @@ -40,7 +44,7 @@ export const useBskyUserManager = ({ const result = await bskyClient.current.follow(user.did); resultUri = result.uri; } - setUsers((prev) => + await setUsers((prev) => prev.map((prevUser) => { if (prevUser.did === user.did) { return { @@ -62,7 +66,7 @@ export const useBskyUserManager = ({ const result = await bskyClient.current.block(user.did); resultUri = result.uri; } - setUsers((prev) => + await setUsers((prev) => prev.map((prevUser) => { if (prevUser.did === user.did) { return { @@ -125,7 +129,7 @@ export const useBskyUserManager = ({ } const result = await bskyClient.current.follow(user.did); resultUri = result.uri; - setUsers((prev) => + await setUsers((prev) => prev.map((prevUser) => { if (prevUser.did === user.did) { return { @@ -149,7 +153,7 @@ export const useBskyUserManager = ({ const result = await bskyClient.current.block(user.did); resultUri = result.uri; } - setUsers((prev) => + await setUsers((prev) => prev.map((prevUser) => { if (prevUser.did === user.did) { return { @@ -175,7 +179,7 @@ export const useBskyUserManager = ({ bskyClient.current = new BskyServiceWorkerClient(session); setActionMode( MESSAGE_NAME_TO_ACTION_MODE_MAP[ - result[STORAGE_KEYS.BSKY_MESSAGE_NAME] + result[STORAGE_KEYS.BSKY_MESSAGE_NAME] ], ); }, diff --git a/src/lib/hooks/useRetrieveBskyUsers.ts b/src/lib/hooks/useRetrieveBskyUsers.ts index f171b21..88c6671 100644 --- a/src/lib/hooks/useRetrieveBskyUsers.ts +++ b/src/lib/hooks/useRetrieveBskyUsers.ts @@ -1,4 +1,6 @@ import type { AtpSessionData } from "@atproto/api"; +import { useStorage } from "@plasmohq/storage/hook"; +import { Storage } from "@plasmohq/storage"; import React from "react"; import { BskyServiceWorkerClient } from "~lib/bskyServiceWorkerClient"; import { @@ -39,7 +41,14 @@ export const useRetrieveBskyUsers = () => { const [detectedXUsers, setDetectedXUsers] = React.useState< ReturnType >([]); - const [users, setUsers] = React.useState([]); + const [users, setUsers] = useStorage({ + key: STORAGE_KEYS.DETECTED_BSKY_USERS, + instance: new Storage({ + area: "local", + }) + }, + (v) => (v === undefined ? [] : v) + ); const [loading, setLoading] = React.useState(true); const [errorMessage, setErrorMessage] = React.useState(""); const [isBottomReached, setIsBottomReached] = React.useState(false); @@ -62,7 +71,7 @@ export const useRetrieveBskyUsers = () => { userData, }); if (searchResult) { - setUsers((prev) => { + await setUsers((prev) => { if (prev.some((u) => u.did === searchResult.bskyProfile.did)) { return prev; } @@ -85,7 +94,7 @@ export const useRetrieveBskyUsers = () => { } } }, - [], + [setUsers], ); const abortControllerRef = React.useRef(null); @@ -170,6 +179,7 @@ export const useRetrieveBskyUsers = () => { }, ); setLoading(true); + await setUsers([]); showModal(); }, []); diff --git a/src/options.tsx b/src/options.tsx index a1d800a..66403ce 100644 --- a/src/options.tsx +++ b/src/options.tsx @@ -1,13 +1,11 @@ -import { useEffect, useState } from "react"; import UserCard from "~lib/components/UserCard"; import { useBskyUserManager } from "~lib/hooks/useBskyUserManager"; -import type { BskyUser } from "~lib/hooks/useRetrieveBskyUsers"; import "./style.css"; import Sidebar from "~lib/components/Sidebar"; const Option = () => { - const [users, setUsers] = useState([]); const { + users, filteredUsers, matchTypeFilter, changeMatchTypeFilter, @@ -15,29 +13,7 @@ const Option = () => { actionMode, actionAll, matchTypeStats, - } = useBskyUserManager({ - users, - setUsers, - }); - useEffect(() => { - chrome.storage.local.get("users", (result) => { - setUsers(JSON.parse(result.users || "[]")); - }); - - const getUsers = () => { - chrome.storage.local.get("users", (result) => { - const _users = JSON.parse(result.users || "[]") as BskyUser[]; - setUsers((prev) => { - const newUsers = _users.filter( - (u) => !prev.some((p) => p.did === u.did), - ); - return [...prev, ...newUsers]; - }); - }); - }; - const interval = setInterval(getUsers, 2000); - return () => clearInterval(interval); - }, []); + } = useBskyUserManager(); const handleActionAll = async () => { if (