Skip to content

Commit c61a8c4

Browse files
authored
Merge pull request #44 from aaron5670/changelog-screen
Added a changelog screen to show the latest extension updates
2 parents 09308d4 + d59b741 commit c61a8c4

10 files changed

+188
-29
lines changed

package.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "toggle-experiment",
33
"displayName": "Toggle Experiment",
44
"description": "A browser extension to inject the LocalStorage of a website for Optimizely experiments.",
5-
"version": "0.8.1",
5+
"version": "0.9.0",
66
"author": "Aaron van den Berg",
77
"homepage": "https://aaronvandenberg.nl/",
88
"scripts": {
@@ -14,6 +14,7 @@
1414
"@emotion/react": "^11.11.1",
1515
"@mantine/core": "^6.0.13",
1616
"@mantine/hooks": "^6.0.13",
17+
"@mantine/notifications": "^6.0.13",
1718
"@plasmohq/storage": "^1.6.1",
1819
"@tabler/icons-react": "^2.22.0",
1920
"immer": "^9.0.21",

pnpm-lock.yaml

+40
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/components/Header.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ const Header = ({ title, description = "" }: HeaderProps) => {
4141
</ActionIcon>
4242
</Group>
4343
</Group>
44-
<Text size="xs" color="dimmed" mt="md" mb="xl">
44+
<Text size="xs" color="dimmed" mb="xl">
4545
{description}
4646
</Text>
4747
</>

src/popup/index.tsx

+29-17
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
11
import { useEffect } from "react";
2-
import { Storage } from "@plasmohq/storage";
32
import useStore from "~store/useStore";
43
import HomeScreen from "~screens/Home";
54
import History from "~screens/History";
65
import Settings from "~screens/Settings";
76
import Search from "~screens/Search";
8-
import type { Screen } from "~types/types";
97
import ConnectOptimizely from "~screens/ConnectOptimizely";
8+
import LatestRelease from "~screens/LatestRelease";
9+
import { MantineProvider } from "@mantine/core";
10+
import { Notifications } from "@mantine/notifications";
11+
import getInitialLocalStorageData from "~utils/getInitialLocalStorageData";
12+
import versionUpdateChecker from "~utils/versionUpdateChecker";
1013

11-
const storage = new Storage();
1214
const broadcastChannel = new BroadcastChannel("broadcastChannel");
1315

1416
function IndexPopup() {
@@ -24,36 +26,46 @@ function IndexPopup() {
2426

2527
useEffect(() => {
2628
const setInitialData = async () => {
27-
const key = await storage.get("localStorageKey");
28-
const value = await storage.get("localStorageValue");
29-
const defaultScreen = await storage.get<Screen | null>("defaultScreen");
30-
const optimizelyAccessToken = await storage.get("optimizelyAccessToken");
31-
const optimizelyProjectId = await storage.get("optimizelyProjectId");
32-
const history = await storage.get("history");
29+
const {
30+
key,
31+
history,
32+
optimizelyProjectId,
33+
optimizelyAccessToken,
34+
value,
35+
defaultScreen,
36+
} = await getInitialLocalStorageData();
37+
3338
setLocalStorageKey(key ?? "optimizelyNonLoggedInUser");
3439
setLocalStorageValue(value ?? "");
3540
setOptimizelyAccessToken(optimizelyAccessToken ?? "");
3641
setOptimizelyProjectId(optimizelyProjectId ?? null);
3742
setScreen(defaultScreen ?? "home");
43+
// setScreen("latest-release");
3844
setHistoryItems(history ? JSON.parse(history) : []);
3945

46+
await versionUpdateChecker(setScreen);
47+
4048
// Broadcast history and localStorageKey to service worker
4149
broadcastChannel.postMessage({
4250
history: history ? JSON.parse(history) : null,
43-
localStorageKey: key ?? "optimizelyNonLoggedInUser",
51+
localStorageKey: key ?? "optimizelyNonLoggedInUser"
4452
});
4553
};
4654
setInitialData();
4755
}, []);
4856

4957
return (
50-
<div style={{ width: 350 }}>
51-
{screen === "home" && <HomeScreen />}
52-
{screen === "history" && <History />}
53-
{screen === "settings" && <Settings />}
54-
{screen === "search" && <Search />}
55-
{screen === "connect-optimizely" && <ConnectOptimizely />}
56-
</div>
58+
<MantineProvider withNormalizeCSS withGlobalStyles>
59+
<Notifications position="top-center" />
60+
<div style={{ width: 350 }}>
61+
{screen === "home" && <HomeScreen />}
62+
{screen === "history" && <History />}
63+
{screen === "settings" && <Settings />}
64+
{screen === "search" && <Search />}
65+
{screen === "connect-optimizely" && <ConnectOptimizely />}
66+
{screen === "latest-release" && <LatestRelease />}
67+
</div>
68+
</MantineProvider>
5769
);
5870
}
5971

src/screens/LatestRelease.tsx

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import { Anchor, Card, Flex, Loader, Text } from "@mantine/core";
2+
import React, { useEffect, useState } from "react";
3+
import ReactMarkdown from "react-markdown";
4+
import useStore from "~store/useStore";
5+
6+
function LatestRelease() {
7+
const { setScreen } = useStore(state => state);
8+
const [latestRelease, setLatestRelease] = useState(null);
9+
10+
useEffect(() => {
11+
const getLatestRelease = async () => {
12+
const response = await fetch("https://api.github.com/repos/aaron5670/toggle-experiments-extension/releases/latest");
13+
const data = await response.json();
14+
const markdownContent = data.body.replace(/\r\n/g, "\n");
15+
16+
setLatestRelease(markdownContent);
17+
};
18+
getLatestRelease();
19+
}, []);
20+
21+
return (
22+
<Card p="lg" radius="md">
23+
{latestRelease ? (
24+
<ReactMarkdown>
25+
{latestRelease}
26+
</ReactMarkdown>
27+
) : (
28+
<Flex
29+
mih={250}
30+
justify="center"
31+
align="center"
32+
direction="row"
33+
wrap="wrap"
34+
>
35+
<Loader size="lg" />
36+
</Flex>
37+
)}
38+
39+
<Text fz="xs" mt="md" align="end">
40+
<Anchor onClick={() => setScreen("home")}>
41+
Go back to home
42+
</Anchor>
43+
</Text>
44+
</Card>
45+
);
46+
}
47+
48+
export default LatestRelease;

src/screens/Search.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,9 @@ function Search() {
6666
rightSectionWidth={37}
6767
/>
6868
) : (
69-
<span>
69+
<Text fz="sm">
7070
Optimizely access token not found. Please go to the <a onClick={() => setScreen("settings")} href="#">settings screen</a> to set it.
71-
</span>
71+
</Text>
7272
)}
7373
{experiments?.length > 0 && (
7474
<>

src/screens/Settings.tsx

+11-7
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Anchor, Button, Card, Center, Group } from "@mantine/core";
1+
import { Text, Anchor, Button, Card, Center, Group } from "@mantine/core";
22
import Header from "~components/Header";
33
import LocalStorageField from "~components/settings/LocalStorageInputField";
44
import DefaultScreenSegmentField from "~components/settings/DefaultScreenSegmentField";
@@ -25,12 +25,16 @@ const Settings = () => {
2525
</Button>
2626
</Center>
2727
<Group position="center">
28-
<Anchor href="https://github.com/aaron5670/toggle-experiments-extension" target="_blank" mt="md">
29-
GitHub
30-
</Anchor>
31-
<Anchor href={`https://github.com/aaron5670/toggle-experiments-extension/releases/v${manifestData.version}`} target="_blank" mt="md">
32-
v{manifestData.version}
33-
</Anchor>
28+
<Text fz="xs" mt="md">
29+
<Anchor href="https://github.com/aaron5670/toggle-experiments-extension" target="_blank" mt="md">
30+
GitHub
31+
</Anchor>
32+
{" "}
33+
<Anchor href={`https://github.com/aaron5670/toggle-experiments-extension/releases/v${manifestData.version}`}
34+
target="_blank" mt="md">
35+
v{manifestData.version}
36+
</Anchor>
37+
</Text>
3438
</Group>
3539
</Card>
3640
);

src/types/types.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
export type Screen = 'home' | 'history' | 'settings' | 'search' | 'connect-optimizely';
1+
export type Screen = 'home' | 'history' | 'settings' | 'search' | 'connect-optimizely' | 'latest-release';
22
export interface HistoryItems {
33
name: string,
44
key: string,
+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import { Storage } from "@plasmohq/storage";
2+
import type { Screen } from "~types/types";
3+
4+
const storage = new Storage();
5+
6+
const getInitialLocalStorageData = async () => {
7+
const key = await storage.get("localStorageKey");
8+
const value = await storage.get("localStorageValue");
9+
const defaultScreen = await storage.get<Screen | null>("defaultScreen");
10+
const optimizelyAccessToken = await storage.get("optimizelyAccessToken");
11+
const optimizelyProjectId = await storage.get("optimizelyProjectId");
12+
const history = await storage.get("history");
13+
14+
return {
15+
key,
16+
value,
17+
defaultScreen,
18+
optimizelyAccessToken,
19+
optimizelyProjectId,
20+
history,
21+
};
22+
};
23+
24+
export default getInitialLocalStorageData;

src/utils/versionUpdateChecker.ts

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import { notifications } from "@mantine/notifications";
2+
import type { Screen } from "~types/types";
3+
import { Storage } from "@plasmohq/storage";
4+
5+
const storage = new Storage();
6+
7+
const versionUpdateChecker = async (setScreen: (screen: Screen) => void) => {
8+
const savedVersion = await storage.get("extensionVersion");
9+
const currentVersion = chrome.runtime.getManifest().version;
10+
11+
if (savedVersion === currentVersion) return;
12+
13+
// If the savedVersion is not the current version, then it means that the user has updated the extension.
14+
await storage.set("extensionVersion", currentVersion);
15+
16+
// Show a notification to the user that a new version is released.
17+
notifications.show({
18+
id: "new-version-release",
19+
title: "A new version is released! 🎉",
20+
message: "Click on this notification to see what's new in this version.",
21+
color: "pink",
22+
autoClose: false,
23+
onClick: () => {
24+
setScreen("latest-release");
25+
notifications.hide("new-version-release");
26+
}
27+
});
28+
};
29+
30+
export default versionUpdateChecker;

0 commit comments

Comments
 (0)