Skip to content

Commit

Permalink
Merge pull request #130 from lexesjan/add-skip-preview-behaviour-option
Browse files Browse the repository at this point in the history
Add skip preview behaviour option
  • Loading branch information
lexesj authored Jan 10, 2022
2 parents 98c8ca7 + 6689dd0 commit cb6aecd
Show file tree
Hide file tree
Showing 15 changed files with 151 additions and 29 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "typescript-aniskip-extension",
"extensionName": "Aniskip",
"version": "1.7.1",
"version": "1.7.2",
"description": "An extension which gives the option to skip anime opening and endings on various streaming sites",
"repository": "https://github.com/lexesjan/typescript-aniskip-extension",
"contributors": [
Expand Down
2 changes: 1 addition & 1 deletion src/components/AnimeSearchModal/AnimeSearchModal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,7 @@ export function AnimeSearchModal({
type="button"
onClick={onClose}
>
Esc
Escape
</Keyboard>
</div>
<hr />
Expand Down
25 changes: 5 additions & 20 deletions src/components/Keyboard/Keyboard.tsx
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
import React from 'react';
import {
HiArrowDown,
HiArrowLeft,
HiArrowRight,
HiArrowUp,
} from 'react-icons/hi';
import { DEFAULT_KEYBOARD_TAG, KeyboardProps } from './Keyboard.types';
DEFAULT_KEYBOARD_TAG,
KeyboardProps,
KEYBOARD_DISPLAY,
} from './Keyboard.types';

export function Keyboard<
TTag extends React.ElementType = typeof DEFAULT_KEYBOARD_TAG
Expand All @@ -23,20 +21,7 @@ export function Keyboard<
return children;
}

switch (children) {
case 'ArrowLeft':
return <HiArrowLeft />;
case 'ArrowRight':
return <HiArrowRight />;
case 'ArrowUp':
return <HiArrowUp />;
case 'ArrowDown':
return <HiArrowDown />;
default:
// no default
}

return children;
return KEYBOARD_DISPLAY[children] ?? children;
};

return React.createElement(
Expand Down
6 changes: 0 additions & 6 deletions src/components/Keyboard/Keyboard.types.ts

This file was deleted.

27 changes: 27 additions & 0 deletions src/components/Keyboard/Keyboard.types.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import React from 'react';
import {
HiArrowDown,
HiArrowLeft,
HiArrowRight,
HiArrowUp,
} from 'react-icons/hi';
import { ComponentPropsWithAs } from '../../utils';

export type KeyboardProps<TTag extends React.ElementType> =
ComponentPropsWithAs<TTag>;

export const DEFAULT_KEYBOARD_TAG = 'span' as const;

export const KEYBOARD_DISPLAY: Record<string, React.ReactNode> = {
ArrowUp: <HiArrowUp />,
ArrowDown: <HiArrowDown />,
ArrowLeft: <HiArrowLeft />,
ArrowRight: <HiArrowRight />,
Control: 'Ctrl',
Backspace: '⌫',
Delete: 'Del',
Escape: 'Esc',
PageUp: 'PgUp',
PageDown: 'PgDn',
Space: '␣',
} as const;
20 changes: 19 additions & 1 deletion src/components/SubmitMenu/SubmitMenu.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@ import {
previewSkipTimeRemoved,
previewSkipTimeIntervalUpdated,
selectPlayerControlsListenerType,
selectIsPreviewButtonEmulatingAutoSkip,
isPreviewButtonEmulatingAutoSkipUpdated,
} from '../../data';
import { FRAME_RATE } from '../../players/base-player.types';

Expand Down Expand Up @@ -74,6 +76,9 @@ export function SubmitMenu(): JSX.Element {
const playerControlsEventListenerType = useSelector(
selectPlayerControlsListenerType
);
const isPreviewButtonEmulatingAutoSkip = useSelector(
selectIsPreviewButtonEmulatingAutoSkip
);
const player = usePlayerRef();
const dispatch = useDispatch();

Expand Down Expand Up @@ -309,8 +314,16 @@ export function SubmitMenu(): JSX.Element {
): Promise<void> => {
event.currentTarget.blur();

if (currentInputFocus === 'start-time') {
if (isPreviewButtonEmulatingAutoSkip) {
player?.setCurrentTime(timeStringToSeconds(startTime) - 2);
player?.play();

return;
}

if (currentInputFocus === 'start-time') {
// Ensure that it does not auto skip.
player?.setCurrentTime(timeStringToSeconds(startTime) + 0.001);
} else {
player?.setCurrentTime(timeStringToSeconds(endTime));
}
Expand Down Expand Up @@ -490,6 +503,11 @@ export function SubmitMenu(): JSX.Element {
syncOptions.changeCurrentTimeLargeLength
)
);
dispatch(
isPreviewButtonEmulatingAutoSkipUpdated(
syncOptions.isPreviewButtonEmulatingAutoSkip
)
);
})();
}, []);

Expand Down
35 changes: 35 additions & 0 deletions src/components/Toggle/Toggle.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import { Switch } from '@headlessui/react';
import React from 'react';
import { FaCheck, FaTimes } from 'react-icons/fa';
import { ToggleProps } from './Toggle.types';

export function Toggle({
className = '',
checked,
onChange,
children,
}: ToggleProps): JSX.Element {
return (
<Switch
className={`${
checked ? 'bg-green-600' : 'bg-gray-500'
} transition-colors relative inline-flex flex-shrink-0 items-center h-6 rounded-full w-10 ${className}`}
checked={checked}
onChange={onChange}
>
{children}
<span
aria-hidden="true"
className={`${
checked ? 'translate-x-[1.125em]' : 'translate-x-1'
} transition absolute flex items-center justify-center w-[1.125em] h-[1.125em] transform bg-white rounded-full`}
>
{checked ? (
<FaCheck className="text-green-600 w-3 h-3" />
) : (
<FaTimes className="text-gray-500 w-4- h-4" />
)}
</span>
</Switch>
);
}
6 changes: 6 additions & 0 deletions src/components/Toggle/Toggle.types.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
export type ToggleProps = {
className?: string;
checked: boolean;
onChange: (value: boolean) => void;
children?: React.ReactNode;
};
2 changes: 2 additions & 0 deletions src/components/Toggle/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export * from './Toggle';
export * from './Toggle.types';
1 change: 1 addition & 0 deletions src/components/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,5 +15,6 @@ export * from './SkipTimeIndicator';
export * from './SkipTimeIndicatorContainer';
export * from './SubmitMenu';
export * from './SubmitMenuButton';
export * from './Toggle';
export * from './VoteMenu';
export * from './VoteMenuButton';
14 changes: 14 additions & 0 deletions src/data/settings/slice.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ const initialSettingsState: SettingsState = {
animeTitleLanguage: DEFAULT_SYNC_OPTIONS.animeTitleLanguage,
isChangelogNotificationVisible:
DEFAULT_SYNC_OPTIONS.isChangelogNotificationVisible,
isPreviewButtonEmulatingAutoSkip:
DEFAULT_SYNC_OPTIONS.isPreviewButtonEmulatingAutoSkip,
isUserEditingKeybind: Object.assign(
{},
...KEYBIND_TYPES.map((type) => ({ [type]: false }))
Expand Down Expand Up @@ -88,6 +90,11 @@ export const selectIsChangelogNotificationVisible: Selector<
boolean
> = (state) => state.settings.isChangelogNotificationVisible;

export const selectIsPreviewButtonEmulatingAutoSkip: Selector<
StateSlice<SettingsState, 'settings'>,
boolean
> = (state) => state.settings.isPreviewButtonEmulatingAutoSkip;

/**
* Slice definition.
*/
Expand Down Expand Up @@ -154,6 +161,12 @@ const settingsStateSlice = createSlice({
changelogNotificationDismissed: (state) => {
state.isChangelogNotificationVisible = false;
},
isPreviewButtonEmulatingAutoSkipUpdated: (
state,
action: PayloadAction<boolean>
) => {
state.isPreviewButtonEmulatingAutoSkip = action.payload;
},
},
});

Expand All @@ -171,5 +184,6 @@ export const {
isUserEditingKeybindUpdated,
changelogNotificationUpdated,
changelogNotificationDismissed,
isPreviewButtonEmulatingAutoSkipUpdated,
} = settingsStateSlice.actions;
export default settingsStateSlice.reducer;
36 changes: 36 additions & 0 deletions src/options/components/SettingsPage/SettingsPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,13 @@ import {
changeCurrentTimeLargeLengthUpdated,
animeTitleLanguageUpdated,
selectAnimeTitleLanguage,
isPreviewButtonEmulatingAutoSkipUpdated,
selectIsPreviewButtonEmulatingAutoSkip,
} from '../../../data';
import { ColourPicker } from '../ColourPicker';
import { serialiseKeybind, useDispatch, useSelector } from '../../../utils';
import { Setting } from '../Setting';
import { Toggle } from '../../../components/Toggle';

export function SettingsPage(): JSX.Element {
const [isSettingsLoaded, setIsSettingsLoaded] = useState<boolean>(false);
Expand All @@ -58,6 +61,9 @@ export function SettingsPage(): JSX.Element {
);
const animeTitleLanguage = useSelector(selectAnimeTitleLanguage);
const isUserEditingKeybind = useSelector(selectIsUserEditingKeybind);
const isPreviewButtonEmulatingAutoSkip = useSelector(
selectIsPreviewButtonEmulatingAutoSkip
);
const keybindInputRef = useRef<HTMLInputElement>(null);
const dispatch = useDispatch();

Expand Down Expand Up @@ -242,6 +248,15 @@ export function SettingsPage(): JSX.Element {
dispatch(animeTitleLanguageUpdated(languageType));
};

/**
* Handles changes to the skip preview behavour.
*
* @param value New value to update to.
*/
const onChangePreviewButtonBehaviour = (value: boolean): void => {
dispatch(isPreviewButtonEmulatingAutoSkipUpdated(value));
};

/**
* Renders a keybind. If no keybind is present, render an add keybind
* button.
Expand Down Expand Up @@ -339,6 +354,11 @@ export function SettingsPage(): JSX.Element {
)
);
dispatch(animeTitleLanguageUpdated(syncOptions.animeTitleLanguage));
dispatch(
isPreviewButtonEmulatingAutoSkipUpdated(
syncOptions.isPreviewButtonEmulatingAutoSkip
)
);
setIsSettingsLoaded(true);
})();
}, []);
Expand All @@ -356,6 +376,7 @@ export function SettingsPage(): JSX.Element {
changeCurrentTimeLength,
changeCurrentTimeLargeLength,
animeTitleLanguage,
isPreviewButtonEmulatingAutoSkip,
});
}
}, [
Expand All @@ -367,6 +388,7 @@ export function SettingsPage(): JSX.Element {
changeCurrentTimeLargeLength,
animeTitleLanguage,
isSettingsLoaded,
isPreviewButtonEmulatingAutoSkip,
]);

return (
Expand Down Expand Up @@ -461,6 +483,20 @@ export function SettingsPage(): JSX.Element {
<span className="pl-1">s</span>
</div>
</Setting>
<Setting
className="pt-3"
name="Emulate an auto skip with the preview button"
description="Clicking the preview button will try to emulate a user auto skipping to the end time. If disabled, the current time is simply set to the start / end time."
>
<Toggle
checked={isPreviewButtonEmulatingAutoSkip}
onChange={onChangePreviewButtonBehaviour}
>
<span className="sr-only">
Enable skip time emulation on preview button click
</span>
</Toggle>
</Setting>
</div>
</div>
<h2 className="text-xl text-gray-900 font-semibold mt-8">
Expand Down
1 change: 1 addition & 0 deletions src/players/jw/metadata.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
"*://kimanime.ru/AnimeIframe/*",
"*://mcloud.to/*",
"*://mcloud2.to/*",
"*://mzcloud.life/*",
"*://rapid-cloud.ru/*",
"*://sbembed.com/*",
"*://sbplay.org/*",
Expand Down
1 change: 1 addition & 0 deletions src/players/plyr/metadata.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
"*://kwik.cx/e/*",
"*://scloud.online/*",
"*://storage.googleapis.com/*",
"*://streamta.site/*",
"*://streamtape.com/*"
]
}
2 changes: 2 additions & 0 deletions src/scripts/background/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,7 @@ export type SyncOptions = {
changeCurrentTimeLargeLength: number;
animeTitleLanguage: AnimeTitleLanguageType;
isChangelogNotificationVisible: boolean;
isPreviewButtonEmulatingAutoSkip: boolean;
};

export const DEFAULT_SYNC_OPTIONS: SyncOptions = {
Expand All @@ -131,6 +132,7 @@ export const DEFAULT_SYNC_OPTIONS: SyncOptions = {
changeCurrentTimeLargeLength: 0.25,
animeTitleLanguage: 'english',
isChangelogNotificationVisible: false,
isPreviewButtonEmulatingAutoSkip: true,
};

export type CacheEntry<T> = {
Expand Down

0 comments on commit cb6aecd

Please sign in to comment.