diff --git a/plugins/BetterSpotifyIntegration/manifest.json b/plugins/BetterSpotifyIntegration/manifest.json
new file mode 100644
index 0000000..011e41c
--- /dev/null
+++ b/plugins/BetterSpotifyIntegration/manifest.json
@@ -0,0 +1,6 @@
+{
+ "name": "BetterSpotifyIntegration",
+ "description": "Shrimply better integration with Spotify",
+ "vendetta": { },
+ "main": "src/index.tsx"
+}
diff --git a/plugins/BetterSpotifyIntegration/src/components/ListenAlongButton.tsx b/plugins/BetterSpotifyIntegration/src/components/ListenAlongButton.tsx
new file mode 100644
index 0000000..6e5b677
--- /dev/null
+++ b/plugins/BetterSpotifyIntegration/src/components/ListenAlongButton.tsx
@@ -0,0 +1,38 @@
+import { findByProps, findByStoreName } from "@vendetta/metro";
+import { getAssetIDByName } from "@vendetta/ui/assets";
+import { Image, View } from "react-native";
+
+const FluxUtils = findByProps("useStateFromStores");
+const SpotifyStore = findByStoreName("SpotifyStore");
+
+const Button = findByProps("Sizes", "Looks") as any;
+const SpotifySyncUtil = findByProps("play", "sync");
+
+interface ListenAlongButtonProps {
+ activity: any;
+ user: any;
+ isCurrentUser: boolean;
+ activityButtonColor: string;
+}
+
+export default function ListenAlongButton(props: ListenAlongButtonProps) {
+ const currentPartyId = FluxUtils.useStateFromStores([SpotifyStore], () => SpotifyStore.getActivity()?.party?.id);
+ const alreadySync = props.isCurrentUser || props.activity?.party?.id === currentPartyId;
+
+ return
+ ;
+}
diff --git a/plugins/BetterSpotifyIntegration/src/index.tsx b/plugins/BetterSpotifyIntegration/src/index.tsx
new file mode 100644
index 0000000..10fa1f6
--- /dev/null
+++ b/plugins/BetterSpotifyIntegration/src/index.tsx
@@ -0,0 +1,30 @@
+import { findByName } from "@vendetta/metro";
+import { before } from "@vendetta/patcher";
+import { findInReactTree } from "@vendetta/utils";
+
+import ListenAlongButton from "./components/ListenAlongButton";
+
+let sectionPatch: () => void;
+
+export default {
+ onLoad() {
+ sectionPatch = before("default", findByName("UserProfileSection", false), ([props]) => {
+ if (props?.title?.includes?.("Spotify") || props.activity.type !== 2) return;
+
+ const spotifyElement = findInReactTree(props.children, e => e?.style?.padding === 0);
+ const actionsIndex = spotifyElement?.children?.findIndex?.(e => e?.type?.name === "Actions");
+
+ if (actionsIndex && actionsIndex !== -1) {
+ const actions = spotifyElement.children[actionsIndex];
+
+ spotifyElement.children[actionsIndex] = <>
+ {actions}
+ {}
+ >;
+ }
+ });
+ },
+ onUnload() {
+ sectionPatch?.();
+ }
+};
diff --git a/plugins/BetterSpotifyIntegration/src/utils/useListeningParty.ts b/plugins/BetterSpotifyIntegration/src/utils/useListeningParty.ts
new file mode 100644
index 0000000..72b4ed4
--- /dev/null
+++ b/plugins/BetterSpotifyIntegration/src/utils/useListeningParty.ts
@@ -0,0 +1,15 @@
+import { findByProps, findByStoreName } from "@vendetta/metro";
+
+const FluxUtils = findByProps("useStateFromStores");
+const SpotifyStore = findByStoreName("SpotifyStore");
+const GamePartyStore = findByStoreName("GamePartyStore");
+const UserStore = findByStoreName("UserStore");
+
+export default function useListeningParty() {
+ const partySet = FluxUtils.useStateFromStores([GamePartyStore, SpotifyStore], () => {
+ const party = GamePartyStore.getParty(SpotifyStore.getActivity()?.party?.id);
+ return party?.size > 1 ? party : null;
+ });
+
+ return partySet ? [...partySet].map(id => UserStore.getUser(id)) : [];
+}