mirror of
https://github.com/snachodog/tok-to-insta-follower-bridge.git
synced 2025-04-23 20:12:22 -06:00
🐛 fixed unnecessary permission requests
This commit is contained in:
parent
c94ad748e2
commit
fa98592205
@ -1,90 +0,0 @@
|
|||||||
// TODO: Remove this file. This is for legacy code.
|
|
||||||
// import type { PlasmoCSConfig } from "plasmo";
|
|
||||||
// import { BskyServiceWorkerClient } from "~lib/bskyServiceWorkerClient";
|
|
||||||
// import { MESSAGE_NAMES, VIEWER_STATE } from "~lib/constants";
|
|
||||||
// import { searchAndInsertBskyUsers } from "~lib/searchAndInsertBskyUsers";
|
|
||||||
// import { type BskyLoginParams } from "../lib/bskyClient";
|
|
||||||
// import "../style.content.legacy.css";
|
|
||||||
|
|
||||||
// export const config: PlasmoCSConfig = {
|
|
||||||
// matches: ["https://twitter.com/*", "https://x.com/*"],
|
|
||||||
// all_frames: true,
|
|
||||||
// };
|
|
||||||
|
|
||||||
// const searchAndShowBskyUsers = async ({
|
|
||||||
// identifier,
|
|
||||||
// password,
|
|
||||||
// messageName,
|
|
||||||
// }: BskyLoginParams & { messageName: string }) => {
|
|
||||||
// const agent = await BskyServiceWorkerClient.createAgent({
|
|
||||||
// identifier,
|
|
||||||
// password,
|
|
||||||
// });
|
|
||||||
|
|
||||||
// switch (messageName) {
|
|
||||||
// case MESSAGE_NAMES.SEARCH_BSKY_USER_ON_FOLLOW_PAGE:
|
|
||||||
// await searchAndInsertBskyUsers({
|
|
||||||
// agent,
|
|
||||||
// btnLabel: {
|
|
||||||
// add: "Follow",
|
|
||||||
// remove: "Unfollow",
|
|
||||||
// progressive: "Following",
|
|
||||||
// },
|
|
||||||
// statusKey: VIEWER_STATE.FOLLOWING,
|
|
||||||
// userCellQueryParam:
|
|
||||||
// '[data-testid="primaryColumn"] [data-testid="UserCell"]',
|
|
||||||
// addQuery: async (arg: string) => await agent.follow(arg),
|
|
||||||
// removeQuery: async (arg: string) => await agent.unfollow(arg),
|
|
||||||
// });
|
|
||||||
// break;
|
|
||||||
// case MESSAGE_NAMES.SEARCH_BSKY_USER_ON_LIST_MEMBERS_PAGE:
|
|
||||||
// await searchAndInsertBskyUsers({
|
|
||||||
// agent,
|
|
||||||
// btnLabel: {
|
|
||||||
// add: "Follow",
|
|
||||||
// remove: "Unfollow",
|
|
||||||
// progressive: "Following",
|
|
||||||
// },
|
|
||||||
// statusKey: VIEWER_STATE.FOLLOWING,
|
|
||||||
// userCellQueryParam:
|
|
||||||
// '[data-testid="cellInnerDiv"] [data-testid="UserCell"]',
|
|
||||||
// addQuery: async (arg: string) => await agent.follow(arg),
|
|
||||||
// removeQuery: async (arg: string) => await agent.unfollow(arg),
|
|
||||||
// });
|
|
||||||
// break;
|
|
||||||
// case MESSAGE_NAMES.SEARCH_BSKY_USER_ON_BLOCK_PAGE:
|
|
||||||
// // TODO: If already blocked, don't show blocking state. because blocking user can't find.
|
|
||||||
// await searchAndInsertBskyUsers({
|
|
||||||
// agent,
|
|
||||||
// btnLabel: {
|
|
||||||
// add: "Block",
|
|
||||||
// remove: "Unblock",
|
|
||||||
// progressive: "Blocking",
|
|
||||||
// },
|
|
||||||
// statusKey: VIEWER_STATE.BLOCKING,
|
|
||||||
// userCellQueryParam: '[data-testid="UserCell"]',
|
|
||||||
// addQuery: async (arg: string) => await agent.block(arg),
|
|
||||||
// removeQuery: async (arg: string) => await agent.unblock(arg),
|
|
||||||
// });
|
|
||||||
// break;
|
|
||||||
// }
|
|
||||||
// };
|
|
||||||
|
|
||||||
// chrome.runtime.onMessage.addListener((message, _, sendResponse) => {
|
|
||||||
// if (Object.values(MESSAGE_NAMES).includes(message.name)) {
|
|
||||||
// searchAndShowBskyUsers({
|
|
||||||
// identifier: message.body.userId,
|
|
||||||
// password: message.body.password,
|
|
||||||
// messageName: message.name,
|
|
||||||
// })
|
|
||||||
// .then(() => {
|
|
||||||
// sendResponse({ hasError: false });
|
|
||||||
// })
|
|
||||||
// .catch((e) => {
|
|
||||||
// console.error(e);
|
|
||||||
// sendResponse({ hasError: true, message: e.toString() });
|
|
||||||
// });
|
|
||||||
// return true;
|
|
||||||
// }
|
|
||||||
// return false;
|
|
||||||
// });
|
|
@ -1,209 +0,0 @@
|
|||||||
import type {
|
|
||||||
ProfileView,
|
|
||||||
ViewerState,
|
|
||||||
} from "@atproto/api/dist/client/types/app/bsky/actor/defs";
|
|
||||||
import { P, match } from "ts-pattern";
|
|
||||||
import van from "vanjs-core";
|
|
||||||
import { BSKY_USER_MATCH_TYPE } from "~lib/constants";
|
|
||||||
|
|
||||||
const { a, div, p, img, button, span } = van.tags;
|
|
||||||
const { svg, path } = van.tagsNS("http://www.w3.org/2000/svg");
|
|
||||||
|
|
||||||
export type UserCellBtnLabel = {
|
|
||||||
add: string;
|
|
||||||
remove: string;
|
|
||||||
progressive: string;
|
|
||||||
};
|
|
||||||
|
|
||||||
const ActionButton = ({
|
|
||||||
statusKey,
|
|
||||||
profile,
|
|
||||||
btnLabel,
|
|
||||||
addAction,
|
|
||||||
removeAction,
|
|
||||||
}: {
|
|
||||||
profile: ProfileView;
|
|
||||||
statusKey: keyof ViewerState;
|
|
||||||
btnLabel: UserCellBtnLabel;
|
|
||||||
addAction: () => Promise<void>;
|
|
||||||
removeAction: () => Promise<void>;
|
|
||||||
}) => {
|
|
||||||
const label = van.state(
|
|
||||||
`${
|
|
||||||
profile.viewer[statusKey] ? btnLabel.progressive : btnLabel.add
|
|
||||||
} on Bluesky`,
|
|
||||||
);
|
|
||||||
|
|
||||||
const isStateOfBeing = van.state(profile.viewer[statusKey]);
|
|
||||||
const isProcessing = van.state(false);
|
|
||||||
const isJustApplied = van.state(false);
|
|
||||||
|
|
||||||
const beingClass = van.derive(() =>
|
|
||||||
isStateOfBeing.val ? "action-button__being" : "",
|
|
||||||
);
|
|
||||||
const processingClass = van.derive(() =>
|
|
||||||
isProcessing.val ? "action-button__processing" : "",
|
|
||||||
);
|
|
||||||
const justAppliedClass = van.derive(() =>
|
|
||||||
isJustApplied.val ? "action-button__just-applied" : "",
|
|
||||||
);
|
|
||||||
|
|
||||||
const onClick = async () => {
|
|
||||||
if (isProcessing.val) return;
|
|
||||||
isProcessing.val = true;
|
|
||||||
label.val = "Processing...";
|
|
||||||
|
|
||||||
if (isStateOfBeing.val) {
|
|
||||||
await removeAction();
|
|
||||||
label.val = `${btnLabel.add} on Bluesky`;
|
|
||||||
isStateOfBeing.val = false;
|
|
||||||
} else {
|
|
||||||
await addAction();
|
|
||||||
label.val = `${btnLabel.progressive} on Bluesky`;
|
|
||||||
isStateOfBeing.val = true;
|
|
||||||
isJustApplied.val = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
isProcessing.val = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
const onMouseover = () => {
|
|
||||||
if (isProcessing.val || isJustApplied.val || !isStateOfBeing.val) return;
|
|
||||||
|
|
||||||
label.val = `${btnLabel.remove} on Bluesky`;
|
|
||||||
};
|
|
||||||
|
|
||||||
const onMouseout = () => {
|
|
||||||
if (isJustApplied.val) {
|
|
||||||
isJustApplied.val = false;
|
|
||||||
}
|
|
||||||
if (!isStateOfBeing.val) return;
|
|
||||||
|
|
||||||
label.val = `${btnLabel.progressive} on Bluesky`;
|
|
||||||
};
|
|
||||||
|
|
||||||
return button(
|
|
||||||
{
|
|
||||||
class: () =>
|
|
||||||
`action-button ${beingClass.val} ${processingClass.val} ${justAppliedClass.val}`,
|
|
||||||
onclick: onClick,
|
|
||||||
onmouseover: onMouseover,
|
|
||||||
onmouseout: onMouseout,
|
|
||||||
},
|
|
||||||
() => label.val,
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
const Avatar = ({ avatar }: { avatar?: string }) => {
|
|
||||||
return avatar
|
|
||||||
? img({ src: avatar, width: "40" })
|
|
||||||
: div({ class: "no-avatar" });
|
|
||||||
};
|
|
||||||
|
|
||||||
const MatchTypeLabel = ({
|
|
||||||
matchType,
|
|
||||||
}: {
|
|
||||||
matchType: (typeof BSKY_USER_MATCH_TYPE)[keyof typeof BSKY_USER_MATCH_TYPE];
|
|
||||||
}) => {
|
|
||||||
const [text, labelClass] = match(matchType)
|
|
||||||
.with(BSKY_USER_MATCH_TYPE.HANDLE, () => [
|
|
||||||
"Same handle name",
|
|
||||||
"match-type__handle",
|
|
||||||
])
|
|
||||||
.with(BSKY_USER_MATCH_TYPE.DISPLAY_NAME, () => [
|
|
||||||
"Same display name",
|
|
||||||
"match-type__display-name",
|
|
||||||
])
|
|
||||||
.with(BSKY_USER_MATCH_TYPE.DESCRIPTION, () => [
|
|
||||||
"Included handle name in description",
|
|
||||||
"match-type__description",
|
|
||||||
])
|
|
||||||
.run();
|
|
||||||
|
|
||||||
return div(
|
|
||||||
{ class: `match-type ${labelClass}` },
|
|
||||||
svg(
|
|
||||||
{
|
|
||||||
fill: "none",
|
|
||||||
width: "12",
|
|
||||||
viewBox: "0 0 24 24",
|
|
||||||
"stroke-width": "3",
|
|
||||||
stroke: "currentColor",
|
|
||||||
class: "w-6 h-6",
|
|
||||||
},
|
|
||||||
path({
|
|
||||||
"stroke-linecap": "round",
|
|
||||||
"stroke-linejoin": "round",
|
|
||||||
d: "M4.5 12.75l6 6 9-13.5",
|
|
||||||
}),
|
|
||||||
),
|
|
||||||
text,
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
export const BskyUserCell = ({
|
|
||||||
profile,
|
|
||||||
statusKey,
|
|
||||||
btnLabel,
|
|
||||||
matchType,
|
|
||||||
addAction,
|
|
||||||
removeAction,
|
|
||||||
}: {
|
|
||||||
profile: ProfileView;
|
|
||||||
statusKey: keyof ViewerState;
|
|
||||||
btnLabel: UserCellBtnLabel;
|
|
||||||
matchType: (typeof BSKY_USER_MATCH_TYPE)[keyof typeof BSKY_USER_MATCH_TYPE];
|
|
||||||
addAction: () => Promise<void>;
|
|
||||||
removeAction: () => Promise<void>;
|
|
||||||
}) => {
|
|
||||||
return div(
|
|
||||||
{ class: "bsky-user-content-wrapper" },
|
|
||||||
MatchTypeLabel({ matchType }),
|
|
||||||
div(
|
|
||||||
{ class: "bsky-user-content bsky-fade-in" },
|
|
||||||
div(
|
|
||||||
{ class: "icon-section" },
|
|
||||||
a(
|
|
||||||
{
|
|
||||||
href: `https://bsky.app/profile/${profile.handle}`,
|
|
||||||
target: "_blank",
|
|
||||||
rel: "noopener",
|
|
||||||
},
|
|
||||||
Avatar({ avatar: profile.avatar }),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
div(
|
|
||||||
{ class: "content" },
|
|
||||||
div(
|
|
||||||
{ class: "name-and-controller" },
|
|
||||||
div(
|
|
||||||
p(
|
|
||||||
{ class: "display-name" },
|
|
||||||
a(
|
|
||||||
{
|
|
||||||
href: `https://bsky.app/profile/${profile.handle}`,
|
|
||||||
target: "_blank",
|
|
||||||
rel: "noopener",
|
|
||||||
},
|
|
||||||
profile.displayName ?? profile.handle,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
p({ class: "handle" }, `@${profile.handle}`),
|
|
||||||
),
|
|
||||||
div(
|
|
||||||
ActionButton({
|
|
||||||
profile,
|
|
||||||
statusKey,
|
|
||||||
btnLabel,
|
|
||||||
addAction,
|
|
||||||
removeAction,
|
|
||||||
}),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
profile.description
|
|
||||||
? p({ class: "description" }, profile.description)
|
|
||||||
: "",
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
};
|
|
@ -1,35 +0,0 @@
|
|||||||
import van from "vanjs-core";
|
|
||||||
|
|
||||||
const { div, p } = van.tags;
|
|
||||||
const { svg, path } = van.tagsNS("http://www.w3.org/2000/svg");
|
|
||||||
|
|
||||||
const WarningIcon = () =>
|
|
||||||
svg(
|
|
||||||
{
|
|
||||||
fill: "none",
|
|
||||||
"stroke-width": "1.5",
|
|
||||||
stroke: "currentColor",
|
|
||||||
class: "w-6 h-6",
|
|
||||||
viewBox: "0 0 24 24",
|
|
||||||
},
|
|
||||||
path({
|
|
||||||
"stroke-linecap": "round",
|
|
||||||
"stroke-linejoin": "round",
|
|
||||||
d: "M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z",
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
export const NotFoundCell = () =>
|
|
||||||
div(
|
|
||||||
{ class: "bsky-user-content-wrapper" },
|
|
||||||
div(
|
|
||||||
{ class: "bsky-user-content bsky-user-content__not-found bsky-fade-in" },
|
|
||||||
WarningIcon(),
|
|
||||||
p(
|
|
||||||
{
|
|
||||||
class: "not-found",
|
|
||||||
},
|
|
||||||
"No similar users found.",
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
@ -1,24 +0,0 @@
|
|||||||
import van from "vanjs-core";
|
|
||||||
|
|
||||||
const { button, div } = van.tags;
|
|
||||||
|
|
||||||
export const ReloadButton = ({ clickAction }: { clickAction: () => void }) => {
|
|
||||||
const deleted = van.state(false);
|
|
||||||
|
|
||||||
return () =>
|
|
||||||
deleted.val
|
|
||||||
? null
|
|
||||||
: div(
|
|
||||||
{ class: "bsky-reload-btn-wrapper" },
|
|
||||||
button(
|
|
||||||
{
|
|
||||||
class: "bsky-reload-btn bsky-fade-in",
|
|
||||||
onclick: () => {
|
|
||||||
clickAction();
|
|
||||||
deleted.val = true;
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"Find More",
|
|
||||||
),
|
|
||||||
);
|
|
||||||
};
|
|
@ -1,13 +1,3 @@
|
|||||||
import type {
|
|
||||||
ProfileView,
|
|
||||||
ViewerState,
|
|
||||||
} from "@atproto/api/dist/client/types/app/bsky/actor/defs";
|
|
||||||
import van from "vanjs-core";
|
|
||||||
import { BskyUserCell, type UserCellBtnLabel } from "./components/BskyUserCell";
|
|
||||||
import { NotFoundCell } from "./components/NotFoundCell";
|
|
||||||
import { ReloadButton } from "./components/ReloadBtn";
|
|
||||||
import type { BSKY_USER_MATCH_TYPE } from "./constants";
|
|
||||||
|
|
||||||
export const getUserCells = ({
|
export const getUserCells = ({
|
||||||
queryParam,
|
queryParam,
|
||||||
filterInsertedElement,
|
filterInsertedElement,
|
||||||
@ -29,20 +19,6 @@ export const getUserCells = ({
|
|||||||
return Array.from(userCells);
|
return Array.from(userCells);
|
||||||
};
|
};
|
||||||
|
|
||||||
export const insertReloadEl = (clickAction: () => void) => {
|
|
||||||
const lastInsertedEl = Array.from(
|
|
||||||
document.querySelectorAll(".bsky-user-content"),
|
|
||||||
).at(-1);
|
|
||||||
van.add(lastInsertedEl.parentElement, ReloadButton({ clickAction }));
|
|
||||||
};
|
|
||||||
|
|
||||||
export const removeReloadEl = () => {
|
|
||||||
const reloadEl = document.querySelectorAll(".bsky-reload-btn-wrapper");
|
|
||||||
for (const el of reloadEl) {
|
|
||||||
el.remove();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
export const getAccountNameAndDisplayName = (userCell: Element) => {
|
export const getAccountNameAndDisplayName = (userCell: Element) => {
|
||||||
const [avatarEl, displayNameEl] = userCell.querySelectorAll("a");
|
const [avatarEl, displayNameEl] = userCell.querySelectorAll("a");
|
||||||
const twAccountName = avatarEl?.getAttribute("href")?.replace("/", "");
|
const twAccountName = avatarEl?.getAttribute("href")?.replace("/", "");
|
||||||
@ -50,42 +26,3 @@ export const getAccountNameAndDisplayName = (userCell: Element) => {
|
|||||||
const twDisplayName = displayNameEl?.textContent;
|
const twDisplayName = displayNameEl?.textContent;
|
||||||
return { twAccountName, twDisplayName, twAccountNameRemoveUnderscore };
|
return { twAccountName, twDisplayName, twAccountNameRemoveUnderscore };
|
||||||
};
|
};
|
||||||
|
|
||||||
export const insertBskyProfileEl = ({
|
|
||||||
dom,
|
|
||||||
profile,
|
|
||||||
statusKey,
|
|
||||||
btnLabel,
|
|
||||||
matchType,
|
|
||||||
addAction,
|
|
||||||
removeAction,
|
|
||||||
}: {
|
|
||||||
dom: Element;
|
|
||||||
profile: ProfileView;
|
|
||||||
statusKey: keyof ViewerState;
|
|
||||||
btnLabel: UserCellBtnLabel;
|
|
||||||
matchType: (typeof BSKY_USER_MATCH_TYPE)[keyof typeof BSKY_USER_MATCH_TYPE];
|
|
||||||
addAction: () => Promise<void>;
|
|
||||||
removeAction: () => Promise<void>;
|
|
||||||
}) => {
|
|
||||||
van.add(
|
|
||||||
dom.parentElement,
|
|
||||||
BskyUserCell({
|
|
||||||
profile,
|
|
||||||
statusKey,
|
|
||||||
btnLabel,
|
|
||||||
matchType,
|
|
||||||
addAction,
|
|
||||||
removeAction,
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
export const insertNotFoundEl = (dom: Element) => {
|
|
||||||
van.add(dom.parentElement, NotFoundCell());
|
|
||||||
};
|
|
||||||
|
|
||||||
export const isOutOfTopViewport = (el: Element) => {
|
|
||||||
const rect = el.getBoundingClientRect();
|
|
||||||
return rect.top < 0;
|
|
||||||
};
|
|
||||||
|
@ -1,142 +0,0 @@
|
|||||||
import type { ViewerState } from "@atproto/api/dist/client/types/app/bsky/actor/defs";
|
|
||||||
import { isSimilarUser } from "~lib/bskyHelpers";
|
|
||||||
import {
|
|
||||||
getAccountNameAndDisplayName,
|
|
||||||
getUserCells,
|
|
||||||
insertBskyProfileEl,
|
|
||||||
insertNotFoundEl,
|
|
||||||
insertReloadEl,
|
|
||||||
} from "~lib/domHelpers";
|
|
||||||
import { debugLog, isOneSymbol } from "~lib/utils";
|
|
||||||
import type { BskyClient } from "./bskyClient";
|
|
||||||
import type { BskyServiceWorkerClient } from "./bskyServiceWorkerClient";
|
|
||||||
import type { UserCellBtnLabel } from "./components/BskyUserCell";
|
|
||||||
import { isOutOfTopViewport, removeReloadEl } from "./domHelpers";
|
|
||||||
|
|
||||||
const notFoundUserCache = new Set<string>();
|
|
||||||
|
|
||||||
const bskyUserUrlMap = new Map<string, string>();
|
|
||||||
|
|
||||||
export const searchAndInsertBskyUsers = async ({
|
|
||||||
agent,
|
|
||||||
btnLabel,
|
|
||||||
userCellQueryParam,
|
|
||||||
statusKey,
|
|
||||||
addQuery,
|
|
||||||
removeQuery,
|
|
||||||
}: {
|
|
||||||
agent: BskyServiceWorkerClient | BskyClient;
|
|
||||||
userCellQueryParam: string;
|
|
||||||
btnLabel: UserCellBtnLabel;
|
|
||||||
statusKey: keyof ViewerState;
|
|
||||||
// biome-ignore lint:
|
|
||||||
addQuery: (arg: string) => Promise<any>;
|
|
||||||
// biome-ignore lint:
|
|
||||||
removeQuery: (arg: string) => Promise<any>;
|
|
||||||
}) => {
|
|
||||||
removeReloadEl();
|
|
||||||
|
|
||||||
const userCells = getUserCells({
|
|
||||||
queryParam: userCellQueryParam,
|
|
||||||
filterInsertedElement: true,
|
|
||||||
});
|
|
||||||
debugLog(`userCells length: ${userCells.length}`);
|
|
||||||
|
|
||||||
let index = 0;
|
|
||||||
|
|
||||||
// loop over twitter user profile cells and search and insert bsky user
|
|
||||||
for (const userCell of userCells) {
|
|
||||||
if (isOutOfTopViewport(userCell)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
const { twAccountName, twDisplayName, twAccountNameRemoveUnderscore } =
|
|
||||||
getAccountNameAndDisplayName(userCell);
|
|
||||||
|
|
||||||
if (notFoundUserCache.has(twAccountName)) {
|
|
||||||
insertNotFoundEl(userCell);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
const searchTerms = [twAccountNameRemoveUnderscore, twDisplayName];
|
|
||||||
|
|
||||||
let targetAccount = null;
|
|
||||||
let matchType = null;
|
|
||||||
|
|
||||||
// Loop over search parameters and break if a user is found
|
|
||||||
searchLoop: for (const term of searchTerms) {
|
|
||||||
// one symbol is not a valid search term for bsky
|
|
||||||
if (!term || isOneSymbol(term)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
const searchResults = await agent.searchUser({
|
|
||||||
term: term,
|
|
||||||
limit: 3,
|
|
||||||
});
|
|
||||||
|
|
||||||
for (const searchResult of searchResults) {
|
|
||||||
const { isSimilar: isUserFound, type } = isSimilarUser(
|
|
||||||
{
|
|
||||||
accountName: twAccountName,
|
|
||||||
accountNameRemoveUnderscore: twAccountNameRemoveUnderscore,
|
|
||||||
displayName: twDisplayName,
|
|
||||||
},
|
|
||||||
searchResult,
|
|
||||||
);
|
|
||||||
|
|
||||||
if (isUserFound) {
|
|
||||||
targetAccount = searchResult;
|
|
||||||
matchType = type;
|
|
||||||
break searchLoop; // Stop searching when a user is found
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
console.error(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// insert bsky profile or not found element
|
|
||||||
if (targetAccount) {
|
|
||||||
insertBskyProfileEl({
|
|
||||||
dom: userCell,
|
|
||||||
profile: targetAccount,
|
|
||||||
statusKey,
|
|
||||||
btnLabel,
|
|
||||||
matchType,
|
|
||||||
addAction: async () => {
|
|
||||||
const result = await addQuery(targetAccount.did);
|
|
||||||
bskyUserUrlMap.set(targetAccount.did, result.uri);
|
|
||||||
},
|
|
||||||
removeAction: async () => {
|
|
||||||
if (targetAccount?.viewer?.following) {
|
|
||||||
await removeQuery(targetAccount?.viewer?.following);
|
|
||||||
} else {
|
|
||||||
await removeQuery(bskyUserUrlMap.get(targetAccount.did));
|
|
||||||
}
|
|
||||||
},
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
insertNotFoundEl(userCell);
|
|
||||||
notFoundUserCache.add(twAccountName);
|
|
||||||
}
|
|
||||||
|
|
||||||
index++;
|
|
||||||
|
|
||||||
if (process.env.NODE_ENV === "development" && index > 5) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: if there are more users, insert reload button
|
|
||||||
insertReloadEl(async () => {
|
|
||||||
await searchAndInsertBskyUsers({
|
|
||||||
agent,
|
|
||||||
btnLabel,
|
|
||||||
userCellQueryParam,
|
|
||||||
statusKey,
|
|
||||||
addQuery,
|
|
||||||
removeQuery,
|
|
||||||
});
|
|
||||||
});
|
|
||||||
};
|
|
@ -3,9 +3,6 @@ import { isSimilarUser } from "~lib/bskyHelpers";
|
|||||||
import {
|
import {
|
||||||
getAccountNameAndDisplayName,
|
getAccountNameAndDisplayName,
|
||||||
getUserCells,
|
getUserCells,
|
||||||
insertBskyProfileEl,
|
|
||||||
insertNotFoundEl,
|
|
||||||
insertReloadEl,
|
|
||||||
} from "~lib/domHelpers";
|
} from "~lib/domHelpers";
|
||||||
import { debugLog, isOneSymbol } from "~lib/utils";
|
import { debugLog, isOneSymbol } from "~lib/utils";
|
||||||
import type { BskyClient } from "./bskyClient";
|
import type { BskyClient } from "./bskyClient";
|
||||||
@ -63,85 +60,3 @@ export const searchBskyUser = async ({
|
|||||||
|
|
||||||
return null;
|
return null;
|
||||||
};
|
};
|
||||||
|
|
||||||
export const searchBskyUsers = async ({
|
|
||||||
agent,
|
|
||||||
userCellQueryParam,
|
|
||||||
}: {
|
|
||||||
agent: BskyServiceWorkerClient | BskyClient;
|
|
||||||
userCellQueryParam: string;
|
|
||||||
}) => {
|
|
||||||
const userCells = getUserCells({
|
|
||||||
queryParam: userCellQueryParam,
|
|
||||||
filterInsertedElement: true,
|
|
||||||
});
|
|
||||||
debugLog(`userCells length: ${userCells.length}`);
|
|
||||||
|
|
||||||
let index = 0;
|
|
||||||
|
|
||||||
const targetAccounts = [] as ProfileView[];
|
|
||||||
|
|
||||||
// loop over twitter user profile cells and search and insert bsky user
|
|
||||||
for (const userCell of userCells) {
|
|
||||||
const { twAccountName, twDisplayName, twAccountNameRemoveUnderscore } =
|
|
||||||
getAccountNameAndDisplayName(userCell);
|
|
||||||
|
|
||||||
if (notFoundUserCache.has(twAccountName)) {
|
|
||||||
insertNotFoundEl(userCell);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
const searchTerms = [twAccountNameRemoveUnderscore, twDisplayName];
|
|
||||||
|
|
||||||
let targetAccount = null;
|
|
||||||
let matchType = null;
|
|
||||||
|
|
||||||
// Loop over search parameters and break if a user is found
|
|
||||||
searchLoop: for (const term of searchTerms) {
|
|
||||||
// one symbol is not a valid search term for bsky
|
|
||||||
if (!term || isOneSymbol(term)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
const searchResults = await agent.searchUser({
|
|
||||||
term: term,
|
|
||||||
limit: 3,
|
|
||||||
});
|
|
||||||
|
|
||||||
for (const searchResult of searchResults) {
|
|
||||||
const { isSimilar: isUserFound, type } = isSimilarUser(
|
|
||||||
{
|
|
||||||
accountName: twAccountName,
|
|
||||||
accountNameRemoveUnderscore: twAccountNameRemoveUnderscore,
|
|
||||||
displayName: twDisplayName,
|
|
||||||
},
|
|
||||||
searchResult,
|
|
||||||
);
|
|
||||||
|
|
||||||
if (isUserFound) {
|
|
||||||
targetAccount = searchResult;
|
|
||||||
matchType = type;
|
|
||||||
break searchLoop; // Stop searching when a user is found
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
console.error(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// insert bsky profile or not found element
|
|
||||||
if (targetAccount) {
|
|
||||||
targetAccounts.push(targetAccount);
|
|
||||||
} else {
|
|
||||||
notFoundUserCache.add(twAccountName);
|
|
||||||
}
|
|
||||||
|
|
||||||
index++;
|
|
||||||
|
|
||||||
// if (process.env.NODE_ENV === "development" && index > 5) {
|
|
||||||
// break
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
|
|
||||||
return targetAccounts;
|
|
||||||
};
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user