diff --git a/src/interfaces.ts b/src/interfaces.ts
index 5a5094ac39..dd273da6d4 100644
--- a/src/interfaces.ts
+++ b/src/interfaces.ts
@@ -215,6 +215,17 @@ export interface PMOperationOptions {
packageManager: IPackageManager;
}
+export interface GistRevision {
+ sha: string;
+ date: string;
+ title: string;
+ changes: {
+ deletions: number;
+ additions: number;
+ total: number;
+ };
+}
+
export enum GlobalSetting {
acceleratorsToBlock = 'acceleratorsToBlock',
channelsToShow = 'channelsToShow',
@@ -236,6 +247,7 @@ export enum GlobalSetting {
knownVersion = 'known-electron-versions',
localVersion = 'local-electron-versions',
packageAuthor = 'packageAuthor',
+ isShowingGistHistory = 'isShowingGistHistory',
packageManager = 'packageManager',
showObsoleteVersions = 'showObsoleteVersions',
showUndownloadedVersions = 'showUndownloadedVersions',
diff --git a/src/less/components/history.less b/src/less/components/history.less
new file mode 100644
index 0000000000..bff838ac67
--- /dev/null
+++ b/src/less/components/history.less
@@ -0,0 +1,76 @@
+.revision-list {
+ max-height: 400px;
+ overflow-y: auto;
+}
+
+.revision-list ul {
+ list-style-type: none;
+ padding: 0;
+ margin: 0;
+}
+
+.revision-item {
+ padding: 10px;
+ margin-bottom: 5px;
+ border-radius: 3px;
+ cursor: pointer;
+ transition: background-color 0.2s ease;
+ border-left: 3px solid #106ba3;
+}
+
+.revision-item:hover {
+ background-color: rgba(167, 182, 194, 0.3);
+}
+
+.revision-item.active {
+ background-color: rgba(16, 107, 163, 0.15);
+ border-left-color: #48aff0;
+}
+
+.revision-item.active:hover {
+ background-color: rgba(16, 107, 163, 0.25);
+}
+
+.active-tag {
+ margin-left: 10px;
+}
+
+.revision-content {
+ display: flex;
+ flex-direction: column;
+}
+
+.revision-icon {
+ margin-right: 8px;
+}
+
+.sha-label {
+ font-size: 12px;
+ color: #738694;
+ margin-left: 10px;
+ font-family: monospace;
+}
+
+.revision-details {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-top: 5px;
+}
+
+.revision-date {
+ color: #738694;
+ font-size: 12px;
+}
+
+.revision-changes {
+ display: flex;
+ gap: 5px;
+}
+
+.history-loading {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ padding: 20px;
+}
diff --git a/src/less/root.less b/src/less/root.less
index e980ccc204..298ff7ccfa 100644
--- a/src/less/root.less
+++ b/src/less/root.less
@@ -10,6 +10,7 @@
// Components
@import 'components/commands.less';
@import 'components/output.less';
+@import 'components/history.less';
@import 'components/dialogs.less';
@import 'components/mosaic.less';
@import 'components/settings.less';
diff --git a/src/renderer/app.tsx b/src/renderer/app.tsx
index cbb28d2dda..54d31f2321 100644
--- a/src/renderer/app.tsx
+++ b/src/renderer/app.tsx
@@ -82,6 +82,7 @@ export class App {
);
this.state.gistId = gistId || '';
+ this.state.activeGistRevision = undefined;
this.state.localPath = localFiddle?.filePath;
this.state.templateName = templateName;
diff --git a/src/renderer/components/commands-action-button.tsx b/src/renderer/components/commands-action-button.tsx
index 4efc0d1974..9c3e976dde 100644
--- a/src/renderer/components/commands-action-button.tsx
+++ b/src/renderer/components/commands-action-button.tsx
@@ -133,6 +133,7 @@ export const GistActionButton = observer(
});
appState.gistId = gist.data.id;
+ appState.activeGistRevision = undefined;
appState.localPath = undefined;
if (appState.isPublishingGistAsRevision) {
@@ -270,6 +271,7 @@ export const GistActionButton = observer(
}
appState.gistId = undefined;
+ appState.activeGistRevision = undefined;
appState.activeGistAction = GistActionState.none;
this.setActionType(GistActionType.publish);
}
diff --git a/src/renderer/components/commands.tsx b/src/renderer/components/commands.tsx
index 86292d2b38..d3cde2cbb0 100644
--- a/src/renderer/components/commands.tsx
+++ b/src/renderer/components/commands.tsx
@@ -9,6 +9,7 @@ import { AddressBar } from './commands-address-bar';
import { BisectHandler } from './commands-bisect';
import { Runner } from './commands-runner';
import { VersionChooser } from './commands-version-chooser';
+import { HistoryWrapper } from './history-wrapper';
import { AppState } from '../state';
interface CommandsProps {
@@ -75,7 +76,14 @@ export const Commands = observer(
{title}
) : undefined}
-
+
+
+
+ {appState.isShowingGistHistory && (
+
+
+
+ )}
diff --git a/src/renderer/components/history-wrapper.tsx b/src/renderer/components/history-wrapper.tsx
new file mode 100644
index 0000000000..c0089d48b8
--- /dev/null
+++ b/src/renderer/components/history-wrapper.tsx
@@ -0,0 +1,79 @@
+import * as React from 'react';
+
+import { Button } from '@blueprintjs/core';
+import { observer } from 'mobx-react';
+
+import { GistHistoryDialog } from './history';
+import { AppState } from '../state';
+
+interface HistoryWrapperProps {
+ appState: AppState;
+ buttonOnly?: boolean;
+ className?: string;
+}
+
+/**
+ * A component that observes the appState and manages the history dialog.
+ * Can be rendered as just a button or as a button with a dialog.
+ */
+@observer
+export class HistoryWrapper extends React.Component {
+ private toggleHistory = () => {
+ const { appState } = this.props;
+ appState.toggleHistory();
+ };
+
+ private handleRevisionSelect = async (revisionId: string) => {
+ const { remoteLoader } = window.app;
+ try {
+ await remoteLoader.fetchGistAndLoad(
+ this.props.appState.gistId!,
+ revisionId,
+ );
+ } catch (error: any) {
+ console.error('Failed to load revision', error);
+ this.props.appState.showErrorDialog(
+ `Failed to load revision: ${error.message || 'Unknown error'}`,
+ );
+ }
+ };
+
+ public renderHistoryButton() {
+ const { className } = this.props;
+
+ return (
+
+ );
+ }
+
+ public render() {
+ const { appState, buttonOnly } = this.props;
+ const dialogKey = 'history-dialog';
+
+ return (
+ <>
+ {buttonOnly ? (
+ this.renderHistoryButton()
+ ) : (
+ <>
+ {this.renderHistoryButton()}
+
+ >
+ )}
+ >
+ );
+ }
+}
diff --git a/src/renderer/components/history.tsx b/src/renderer/components/history.tsx
new file mode 100644
index 0000000000..c8a576c885
--- /dev/null
+++ b/src/renderer/components/history.tsx
@@ -0,0 +1,206 @@
+import * as React from 'react';
+
+import {
+ Classes,
+ Dialog,
+ Icon,
+ NonIdealState,
+ Spinner,
+ Tag,
+} from '@blueprintjs/core';
+import { IReactionDisposer, reaction } from 'mobx';
+import { observer } from 'mobx-react';
+
+import { GistRevision } from 'src/interfaces';
+
+import { AppState } from '../state';
+
+interface HistoryProps {
+ appState: AppState;
+ isOpen: boolean;
+ onClose: () => void;
+ onRevisionSelect: (revisionId: string) => Promise;
+ activeRevision?: string;
+}
+
+interface HistoryState {
+ isLoading: boolean;
+ revisions: GistRevision[];
+ error: string | null;
+}
+
+@observer
+export class GistHistoryDialog extends React.Component<
+ HistoryProps,
+ HistoryState
+> {
+ private disposeReaction: IReactionDisposer | null = null;
+
+ constructor(props: HistoryProps) {
+ super(props);
+ this.state = {
+ isLoading: true,
+ revisions: [],
+ error: null,
+ };
+ }
+
+ public componentDidMount() {
+ this.disposeReaction = reaction(
+ () => this.props.appState.gistId,
+ () => this.loadRevisions(),
+ );
+
+ if (this.props.isOpen) {
+ this.loadRevisions();
+ }
+ }
+
+ public componentDidUpdate(prevProps: HistoryProps) {
+ if (this.props.isOpen && !prevProps.isOpen) {
+ this.loadRevisions();
+ }
+ }
+
+ public componentWillUnmount() {
+ this.disposeReaction?.();
+ }
+
+ private async loadRevisions() {
+ const { appState, isOpen } = this.props;
+ const { remoteLoader } = window.app;
+
+ if (!isOpen) return;
+
+ if (!appState.gistId) {
+ this.setState({ isLoading: false, error: 'No Gist ID available' });
+ return;
+ }
+
+ this.setState({ isLoading: true, error: null });
+
+ try {
+ const revisions = await remoteLoader.getGistRevisions(appState.gistId);
+ this.setState({ revisions, isLoading: false });
+ } catch (error) {
+ console.error('Failed to load gist revisions', error);
+ this.setState({
+ isLoading: false,
+ error: 'Failed to load revision history',
+ });
+ }
+ }
+
+ private handleRevisionSelect = async (revision: GistRevision) => {
+ try {
+ await this.props.onRevisionSelect(revision.sha);
+ this.props.onClose();
+ } catch (error: any) {
+ console.error('Failed to load revision', error);
+ this.props.appState.showErrorDialog(
+ `Failed to load revision: ${error.message || 'Unknown error'}`,
+ );
+ this.props.onClose();
+ }
+ };
+
+ private renderChangeStats(changes: GistRevision['changes']) {
+ return (
+
+
+ +{changes.additions}
+
+
+ -{changes.deletions}
+
+ {changes.total} total
+
+ );
+ }
+
+ private renderRevisionItem = (revision: GistRevision, index: number) => {
+ const date = new Date(revision.date).toLocaleString();
+ const shortSha = revision.sha.substring(0, 7);
+ const isActive = this.props.activeRevision === revision.sha;
+
+ return (
+ this.handleRevisionSelect(revision)}
+ >
+
+
+
+ {revision.title}
+ {shortSha}
+ {isActive && (
+
+ Active
+
+ )}
+
+
+ {date}
+ {this.renderChangeStats(revision.changes)}
+
+
+
+ );
+ };
+
+ private renderContent() {
+ const { isLoading, revisions, error } = this.state;
+
+ if (isLoading) {
+ return (
+
+
+
Loading revision history...
+
+ );
+ }
+
+ if (error) {
+ return (
+
+ );
+ }
+
+ if (revisions.length === 0) {
+ return (
+
+ );
+ }
+
+ return (
+
+
{revisions.reverse().map(this.renderRevisionItem)}
+
+ );
+ }
+
+ public render() {
+ const { isOpen, onClose } = this.props;
+
+ return (
+
+ );
+ }
+}
diff --git a/src/renderer/components/settings-general-gist.tsx b/src/renderer/components/settings-general-gist.tsx
new file mode 100644
index 0000000000..3df8984f49
--- /dev/null
+++ b/src/renderer/components/settings-general-gist.tsx
@@ -0,0 +1,90 @@
+import * as React from 'react';
+
+import { Callout, Checkbox, FormGroup, InputGroup } from '@blueprintjs/core';
+import { observer } from 'mobx-react';
+
+import { AppState } from '../state';
+
+interface GistSettingsProps {
+ appState: AppState;
+}
+
+interface IGistSettingsState {
+ packageAuthor: string;
+ isShowingGistHistory: boolean;
+}
+
+/**
+ * Settings package.json author info
+ */
+export const GistSettings = observer(
+ class GistSettings extends React.Component<
+ GistSettingsProps,
+ IGistSettingsState
+ > {
+ constructor(props: GistSettingsProps) {
+ super(props);
+
+ this.state = {
+ packageAuthor: this.props.appState.packageAuthor,
+ isShowingGistHistory: this.props.appState.isShowingGistHistory,
+ };
+
+ this.handlePackageAuthorChange =
+ this.handlePackageAuthorChange.bind(this);
+ this.handleGistHistoryChange = this.handleGistHistoryChange.bind(this);
+ }
+
+ /**
+ * Set the author information in package.json when processing uploads to gist.
+ */
+ public handlePackageAuthorChange(event: React.FormEvent) {
+ const { value } = event.currentTarget;
+
+ this.setState({ packageAuthor: value });
+
+ this.props.appState.packageAuthor = value;
+ }
+
+ /**
+ * Toggle the visibility of the Gist history.
+ */
+ public handleGistHistoryChange = (
+ event: React.FormEvent,
+ ) => {
+ const { checked } = event.currentTarget;
+
+ this.setState({ isShowingGistHistory: checked });
+
+ this.props.appState.isShowingGistHistory = checked;
+ };
+
+ public render() {
+ const PackageAuthorDescription =
+ 'Set the package.json author field for your exported Fiddle projects.';
+ const GistHistoryDescription =
+ 'Show the history of your Gist uploads and optionally load previous revisions.';
+
+ return (
+
+
Gists
+
+
+ {PackageAuthorDescription}
+
+ {GistHistoryDescription}
+
+
+
+
+ );
+ }
+ },
+);
diff --git a/src/renderer/components/settings-general-package-author.tsx b/src/renderer/components/settings-general-package-author.tsx
deleted file mode 100644
index 1035ead6dc..0000000000
--- a/src/renderer/components/settings-general-package-author.tsx
+++ /dev/null
@@ -1,70 +0,0 @@
-import * as React from 'react';
-
-import { Callout, FormGroup, InputGroup } from '@blueprintjs/core';
-import { observer } from 'mobx-react';
-
-import { AppState } from '../state';
-
-interface PackageAuthorSettingsProps {
- appState: AppState;
-}
-
-interface IPackageAuthorSettingsState {
- value: string;
-}
-
-/**
- * Settings package.json author info
- */
-export const PackageAuthorSettings = observer(
- class PackageAuthorSettings extends React.Component<
- PackageAuthorSettingsProps,
- IPackageAuthorSettingsState
- > {
- constructor(props: PackageAuthorSettingsProps) {
- super(props);
-
- this.state = {
- value: this.props.appState.packageAuthor,
- };
-
- this.handlePackageAuthorChange =
- this.handlePackageAuthorChange.bind(this);
- }
-
- /**
- * Set the author information in package.json when processing uploads to gist
- */
- public handlePackageAuthorChange(event: React.FormEvent) {
- const { value } = event.currentTarget;
-
- this.setState({
- value,
- });
-
- this.props.appState.packageAuthor = value;
- }
-
- public render() {
- const packageAuthorLabel =
- 'Set the package.json author field for your exported Fiddle projects.';
-
- return (
-
-
Package Author
-
-
- ) =>
- this.handlePackageAuthorChange(e)
- }
- />
-
-
-
- );
- }
- },
-);
diff --git a/src/renderer/components/settings-general.tsx b/src/renderer/components/settings-general.tsx
index 25bf04eb7e..998b928f13 100644
--- a/src/renderer/components/settings-general.tsx
+++ b/src/renderer/components/settings-general.tsx
@@ -7,9 +7,9 @@ import { AppearanceSettings } from './settings-general-appearance';
import { BlockAcceleratorsSettings } from './settings-general-block-accelerators';
import { ConsoleSettings } from './settings-general-console';
import { FontSettings } from './settings-general-font';
+import { GistSettings } from './settings-general-gist';
import { GitHubSettings } from './settings-general-github';
import { MirrorSettings } from './settings-general-mirror';
-import { PackageAuthorSettings } from './settings-general-package-author';
import { AppState } from '../state';
interface GeneralSettingsProps {
@@ -39,7 +39,7 @@ export const GeneralSettings = observer(
-
+
diff --git a/src/renderer/file-manager.ts b/src/renderer/file-manager.ts
index b03a236307..34d62a926e 100644
--- a/src/renderer/file-manager.ts
+++ b/src/renderer/file-manager.ts
@@ -46,6 +46,7 @@ export class FileManager {
if (filePath !== localPath) {
this.appState.localPath = filePath;
this.appState.gistId = undefined;
+ this.appState.activeGistRevision = undefined;
}
window.ElectronFiddle.setShowMeTemplate();
this.appState.templateName = undefined;
diff --git a/src/renderer/remote-loader.ts b/src/renderer/remote-loader.ts
index 3a309bca47..005004909a 100644
--- a/src/renderer/remote-loader.ts
+++ b/src/renderer/remote-loader.ts
@@ -11,6 +11,7 @@ import {
EditorValues,
ElectronReleaseChannel,
GenericDialogType,
+ GistRevision,
InstallState,
PACKAGE_NAME,
VersionSource,
@@ -115,13 +116,45 @@ export class RemoteLoader {
}
}
+ public async getGistRevisions(gistId: string): Promise {
+ try {
+ const octo = await getOctokit(this.appState);
+ const { data: revisions } = await octo.gists.listCommits({
+ gist_id: gistId,
+ });
+
+ // Filter out empty revisions (0 additions and 0 deletions)
+ const nonEmptyRevisions = revisions.filter(
+ (r) => r.change_status.additions > 0 || r.change_status.deletions > 0,
+ );
+
+ return nonEmptyRevisions.reverse().map((r, i) => {
+ return {
+ sha: r.version,
+ date: r.committed_at,
+ changes: r.change_status,
+ title: i === 0 ? 'Created' : `Revision ${i}`,
+ };
+ });
+ } catch (error: any) {
+ this.handleLoadingFailed(error);
+ return [];
+ }
+ }
+
/**
* Load a fiddle
*/
- public async fetchGistAndLoad(gistId: string): Promise {
+ public async fetchGistAndLoad(
+ gistId: string,
+ revision?: string,
+ ): Promise {
try {
const octo = await getOctokit(this.appState);
- const gist = await octo.gists.get({ gist_id: gistId });
+ const gist = revision
+ ? await octo.gists.getRevision({ gist_id: gistId, sha: revision })
+ : await octo.gists.get({ gist_id: gistId });
+
const values: EditorValues = {};
for (const [id, data] of Object.entries(gist.data.files)) {
@@ -199,7 +232,15 @@ export class RemoteLoader {
);
}
- return this.handleLoadingSuccess(values, gistId);
+ const result = await this.handleLoadingSuccess(values, gistId);
+
+ // Set the active revision - either the specified revision or the latest one
+ const activeRevision = revision || gist.data.history?.[0]?.version;
+ if (activeRevision) {
+ this.appState.activeGistRevision = activeRevision;
+ }
+
+ return result;
} catch (error: any) {
return this.handleLoadingFailed(error);
}
diff --git a/src/renderer/state.ts b/src/renderer/state.ts
index c421af435f..48d192c1ab 100644
--- a/src/renderer/state.ts
+++ b/src/renderer/state.ts
@@ -118,6 +118,9 @@ export class AppState {
public packageAuthor =
(localStorage.getItem(GlobalSetting.packageAuthor) as string) ??
window.ElectronFiddle.getUsername();
+ public isShowingGistHistory = !!(
+ this.retrieve(GlobalSetting.isShowingGistHistory) ?? true
+ );
public electronMirror: typeof ELECTRON_MIRROR =
(this.retrieve(GlobalSetting.electronMirror) as typeof ELECTRON_MIRROR) ===
null
@@ -133,6 +136,7 @@ export class AppState {
// -- Various session-only state ------------------
public gistId: string | undefined = undefined;
+ public activeGistRevision: string | undefined = undefined;
public readonly versions: Record = {};
public version = '';
public output: Array = [];
@@ -168,6 +172,7 @@ export class AppState {
public isSettingsShowing = false;
public isThemeDialogShowing = false;
public isTokenDialogShowing = false;
+ public isHistoryShowing = false;
public isTourShowing = !localStorage.getItem(GlobalSetting.hasShownTour);
public isUpdatingElectronVersions = false;
public isDownloadingAll = false;
@@ -218,6 +223,7 @@ export class AppState {
genericDialogLastResult: observable,
genericDialogOptions: observable,
gistId: observable,
+ activeGistRevision: observable,
gitHubAvatarUrl: observable,
gitHubLogin: observable,
gitHubName: observable,
@@ -232,6 +238,7 @@ export class AppState {
isConsoleShowing: observable,
isEnablingElectronLogging: observable,
isGenericDialogShowing: observable,
+ isHistoryShowing: observable,
isInstallingModules: observable,
isKeepingUserDataDirs: observable,
isOnline: observable,
@@ -245,6 +252,7 @@ export class AppState {
isUpdatingElectronVersions: observable,
isDeletingAll: observable,
isDownloadingAll: observable,
+ isShowingGistHistory: observable,
isUsingSystemTheme: observable,
localPath: observable,
modules: observable,
@@ -415,6 +423,7 @@ export class AppState {
case GlobalSetting.isEnablingElectronLogging:
case GlobalSetting.isKeepingUserDataDirs:
case GlobalSetting.isPublishingGistAsRevision:
+ case GlobalSetting.isShowingGistHistory:
case GlobalSetting.isUsingSystemTheme:
case GlobalSetting.packageAuthor:
case GlobalSetting.packageManager:
@@ -536,6 +545,9 @@ export class AppState {
this.save(GlobalSetting.acceleratorsToBlock, this.acceleratorsToBlock),
);
autorun(() => this.save(GlobalSetting.packageAuthor, this.packageAuthor));
+ autorun(() =>
+ this.save(GlobalSetting.isShowingGistHistory, this.isShowingGistHistory),
+ );
autorun(() => this.save(GlobalSetting.electronMirror, this.electronMirror));
autorun(() => this.save(GlobalSetting.fontFamily, this.fontFamily));
autorun(() => this.save(GlobalSetting.fontSize, this.fontSize));
@@ -710,6 +722,10 @@ export class AppState {
this.resetView({ isSettingsShowing: !this.isSettingsShowing });
}
+ public toggleHistory() {
+ this.isHistoryShowing = !this.isHistoryShowing;
+ }
+
public updateDownloadProgress(version: string, progress: ProgressObject) {
const percent = Math.round(progress.percent * 100) / 100;
const ver = this.versions[version];
diff --git a/tests/mocks/state.ts b/tests/mocks/state.ts
index d86a5bcb73..a6d1b8c15c 100644
--- a/tests/mocks/state.ts
+++ b/tests/mocks/state.ts
@@ -25,6 +25,7 @@ export class StateMock {
public genericDialogLastResult: boolean | null = null;
public genericDialogOptions = {} as GenericDialogOptions;
public gistId = '';
+ public activeGistRevision: string | undefined = undefined;
public gitHubAvatarUrl: string | null = null;
public gitHubLogin: string | null = null;
public gitHubName: string | null = null;
diff --git a/tests/renderer/components/__snapshots__/commands-spec.tsx.snap b/tests/renderer/components/__snapshots__/commands-spec.tsx.snap
index 539ea0b0fa..5f5d02f15a 100644
--- a/tests/renderer/components/__snapshots__/commands-spec.tsx.snap
+++ b/tests/renderer/components/__snapshots__/commands-spec.tsx.snap
@@ -44,9 +44,13 @@ exports[`Commands component > renders when system is darwin 1`] = `
Electron Fiddle
-
+
+
+
@@ -93,9 +97,13 @@ exports[`Commands component > renders when system not is darwin 1`] = `
-
+
+
+
diff --git a/tests/renderer/components/__snapshots__/settings-general-package-author-spec.tsx.snap b/tests/renderer/components/__snapshots__/settings-general-gist-spec.tsx.snap
similarity index 50%
rename from tests/renderer/components/__snapshots__/settings-general-package-author-spec.tsx.snap
rename to tests/renderer/components/__snapshots__/settings-general-gist-spec.tsx.snap
index 1614e4edc6..764eb51440 100644
--- a/tests/renderer/components/__snapshots__/settings-general-package-author-spec.tsx.snap
+++ b/tests/renderer/components/__snapshots__/settings-general-gist-spec.tsx.snap
@@ -3,18 +3,24 @@
exports[`PackageAuthorSettings component > renders 1`] = `
- Package Author
+ Gists
-
+
+
+ Set the package.json author field for your exported Fiddle projects.
+
+
+ Show the history of your Gist uploads and optionally load previous revisions.
+
+
diff --git a/tests/renderer/components/__snapshots__/settings-general-spec.tsx.snap b/tests/renderer/components/__snapshots__/settings-general-spec.tsx.snap
index 0ea9f18479..f9bd4c9331 100644
--- a/tests/renderer/components/__snapshots__/settings-general-spec.tsx.snap
+++ b/tests/renderer/components/__snapshots__/settings-general-spec.tsx.snap
@@ -26,7 +26,7 @@ exports[`GeneralSettings component > renders 1`] = `
appState={{}}
/>
-
diff --git a/tests/renderer/components/settings-general-package-author-spec.tsx b/tests/renderer/components/settings-general-gist-spec.tsx
similarity index 51%
rename from tests/renderer/components/settings-general-package-author-spec.tsx
rename to tests/renderer/components/settings-general-gist-spec.tsx
index 55ccf3e9ea..a65eb7691a 100644
--- a/tests/renderer/components/settings-general-package-author-spec.tsx
+++ b/tests/renderer/components/settings-general-gist-spec.tsx
@@ -4,7 +4,7 @@ import { InputGroup } from '@blueprintjs/core';
import { shallow } from 'enzyme';
import { beforeEach, describe, expect, it } from 'vitest';
-import { PackageAuthorSettings } from '../../../src/renderer/components/settings-general-package-author';
+import { GistSettings } from '../../../src/renderer/components/settings-general-gist';
import { AppState } from '../../../src/renderer/state';
describe('PackageAuthorSettings component', () => {
@@ -15,13 +15,34 @@ describe('PackageAuthorSettings component', () => {
});
it('renders', () => {
- const wrapper = shallow(
);
+ const wrapper = shallow(
);
expect(wrapper).toMatchSnapshot();
});
+ describe('handleGistHistoryChange()', () => {
+ it('handles gist history', async () => {
+ const wrapper = shallow(
);
+ const instance: any = wrapper.instance();
+
+ instance.handleGistHistoryChange({
+ currentTarget: { checked: true },
+ } as React.FormEvent
);
+
+ expect(store.isShowingGistHistory).toEqual(true);
+ expect(instance.state.isShowingGistHistory).toEqual(true);
+
+ instance.handleGistHistoryChange({
+ currentTarget: { checked: false },
+ } as React.FormEvent);
+
+ expect(store.isShowingGistHistory).toEqual(false);
+ expect(instance.state.isShowingGistHistory).toEqual(false);
+ });
+ });
+
describe('handlePackageAuthorChange()', () => {
it('handles package author', async () => {
- const wrapper = shallow();
+ const wrapper = shallow();
const instance: any = wrapper.instance();
const author = 'electron';
@@ -31,20 +52,20 @@ describe('PackageAuthorSettings component', () => {
} as React.FormEvent);
expect(store.packageAuthor).toEqual(author);
- expect(instance.state.value).toEqual(author);
+ expect(instance.state.packageAuthor).toEqual(author);
instance.handlePackageAuthorChange({
currentTarget: { value: 'test' },
} as React.FormEvent);
expect(store.packageAuthor).toEqual('test');
- expect(instance.state.value).toEqual('test');
+ expect(instance.state.packageAuthor).toEqual('test');
const event = { currentTarget: { value: 'test-onchange' } };
wrapper.find(InputGroup).simulate('change', event);
expect(store.packageAuthor).toEqual('test-onchange');
- expect(instance.state.value).toEqual('test-onchange');
+ expect(instance.state.packageAuthor).toEqual('test-onchange');
});
});
});
diff --git a/tests/renderer/components/settings-general-spec.tsx b/tests/renderer/components/settings-general-spec.tsx
index 9d17b34b72..1ae763d912 100644
--- a/tests/renderer/components/settings-general-spec.tsx
+++ b/tests/renderer/components/settings-general-spec.tsx
@@ -29,12 +29,9 @@ vi.mock(
}),
);
-vi.mock(
- '../../../src/renderer/components/settings-general-package-author',
- () => ({
- PackageAuthorSettings: 'settings-package-author',
- }),
-);
+vi.mock('../../../src/renderer/components/settings-general-gist', () => ({
+ GistSettings: 'settings-gist',
+}));
vi.mock('../../../src/renderer/components/settings-general-mirror', () => ({
MirrorSettings: 'settings-general-mirror',