diff --git a/chrome-extension/lib/background/index.ts b/chrome-extension/lib/background/index.ts index dc4cc43..7ed1b8e 100644 --- a/chrome-extension/lib/background/index.ts +++ b/chrome-extension/lib/background/index.ts @@ -1,9 +1,9 @@ import 'webextension-polyfill'; -// import { exampleThemeStorage } from '@chrome-extension-boilerplate/storage'; +import { subtitleSettingStorage } from '@chrome-extension-boilerplate/storage'; -// exampleThemeStorage.get().then(theme => { -// console.log('theme', theme); -// }); +subtitleSettingStorage.get().then(settings => { + console.log('subtitle settings', settings); +}); console.log('background loaded'); console.log("Edit 'chrome-extension/lib/background/index.ts' and save to reload."); diff --git a/packages/storage/lib/index.ts b/packages/storage/lib/index.ts index 8762790..8ecde5c 100644 --- a/packages/storage/lib/index.ts +++ b/packages/storage/lib/index.ts @@ -1,4 +1,4 @@ import { createStorage, StorageType, type BaseStorage, SessionAccessLevel } from './base'; -import { exampleThemeStorage } from './exampleThemeStorage'; +import { subtitleSettingStorage } from './settingStorage'; -export { exampleThemeStorage, createStorage, StorageType, SessionAccessLevel, BaseStorage }; +export { subtitleSettingStorage, createStorage, StorageType, SessionAccessLevel, BaseStorage }; diff --git a/packages/storage/lib/settingStorage.ts b/packages/storage/lib/settingStorage.ts new file mode 100644 index 0000000..9c0ef8b --- /dev/null +++ b/packages/storage/lib/settingStorage.ts @@ -0,0 +1,45 @@ +import { BaseStorage, createStorage, StorageType } from './base'; + +interface SubtitleSetting { + color: string; + background: string; + font: string; + spacing: number; + stroke: number; + size: number; +} + +const defaultSubtitleSetting: SubtitleSetting = { + color: '#FFFFFF', + background: '#191919', + font: 'Arial', + spacing: 0, + stroke: 0, + size: 12, +}; + +type SubtitleSettingStorage = BaseStorage & { + saveSettings: (settings: SubtitleSetting) => Promise; + loadSettings: () => Promise; + resetSettings: () => Promise; +}; + +const storageKey = 'subtitle-settings'; + +const storage = createStorage(storageKey, defaultSubtitleSetting, { + storageType: StorageType.Sync, + liveUpdate: true, +}); + +export const subtitleSettingStorage: SubtitleSettingStorage = { + ...storage, + saveSettings: async (settings: SubtitleSetting) => { + await storage.set(settings); + }, + loadSettings: async () => { + return storage.get(); + }, + resetSettings: async () => { + await storage.set(defaultSubtitleSetting); + }, +}; diff --git a/pages/content/lib/index.ts b/pages/content/lib/index.ts index 596a917..871ea01 100644 --- a/pages/content/lib/index.ts +++ b/pages/content/lib/index.ts @@ -1,5 +1 @@ -import { toggleTheme } from '@lib/toggleTheme'; - console.log('content script loaded'); - -void toggleTheme(); diff --git a/pages/content/lib/toggleTheme.ts b/pages/content/lib/toggleTheme.ts index 8b0c5b6..ea6bcca 100644 --- a/pages/content/lib/toggleTheme.ts +++ b/pages/content/lib/toggleTheme.ts @@ -1,7 +1,7 @@ -import { exampleThemeStorage } from '@chrome-extension-boilerplate/storage'; +// import { exampleThemeStorage } from '@chrome-extension-boilerplate/storage'; -export async function toggleTheme() { - console.log('initial theme:', await exampleThemeStorage.get()); - await exampleThemeStorage.toggle(); - console.log('toggled theme:', await exampleThemeStorage.get()); -} +// export async function toggleTheme() { +// console.log('initial theme:', await exampleThemeStorage.get()); +// await exampleThemeStorage.toggle(); +// console.log('toggled theme:', await exampleThemeStorage.get()); +// } diff --git a/pages/options/src/Options.tsx b/pages/options/src/Options.tsx index ff1eeb0..6ceb91c 100644 --- a/pages/options/src/Options.tsx +++ b/pages/options/src/Options.tsx @@ -1,39 +1,39 @@ import '@src/Options.css'; -import { useStorageSuspense, withErrorBoundary, withSuspense } from '@chrome-extension-boilerplate/shared'; -import { exampleThemeStorage } from '@chrome-extension-boilerplate/storage'; -import { ComponentPropsWithoutRef } from 'react'; +import { withErrorBoundary, withSuspense } from '@chrome-extension-boilerplate/shared'; +// import { exampleThemeStorage } from '@chrome-extension-boilerplate/storage'; +// import { ComponentPropsWithoutRef } from 'react'; const Options = () => { - const theme = useStorageSuspense(exampleThemeStorage); + // const theme = useStorageSuspense(exampleThemeStorage); return (
logo - Options + {/* Options */} Edit pages/options/src/Options.tsx and save to reload. - Toggle theme + {/* Toggle theme */}
); }; -const ToggleButton = (props: ComponentPropsWithoutRef<'button'>) => { - const theme = useStorageSuspense(exampleThemeStorage); - return ( - - ); -}; +// const ToggleButton = (props: ComponentPropsWithoutRef<'button'>) => { +// const theme = useStorageSuspense(exampleThemeStorage); +// return ( +// +// ); +// }; export default withErrorBoundary(withSuspense(Options,
Loading ...
),
Error Occur
); diff --git a/pages/popup/public/logo.png b/pages/popup/public/logo.png new file mode 100644 index 0000000..261b073 Binary files /dev/null and b/pages/popup/public/logo.png differ diff --git a/pages/popup/src/Popup.tsx b/pages/popup/src/Popup.tsx index 55187b9..2f6949f 100644 --- a/pages/popup/src/Popup.tsx +++ b/pages/popup/src/Popup.tsx @@ -1,52 +1,164 @@ -import '@src/Popup.css'; +import { useCallback, useEffect, useState } from 'react'; import { useStorageSuspense, withErrorBoundary, withSuspense } from '@chrome-extension-boilerplate/shared'; -import { exampleThemeStorage } from '@chrome-extension-boilerplate/storage'; +import { subtitleSettingStorage } from '@chrome-extension-boilerplate/storage'; -import { ComponentPropsWithoutRef } from 'react'; +type View = 'home' | 'options'; const Popup = () => { - const theme = useStorageSuspense(exampleThemeStorage); + const subtitleSetting = useStorageSuspense(subtitleSettingStorage); - return ( -
-
- logo + const [activeView, setActiveView] = useState('home'); + const [color, setColor] = useState(subtitleSetting.color); + const [background, setBackground] = useState(subtitleSetting.background); + const [font, setFont] = useState(subtitleSetting.font); + const [spacing, setSpacing] = useState(subtitleSetting.spacing); + const [stroke, setStroke] = useState(subtitleSetting.stroke); + const [size, setSize] = useState(subtitleSetting.size); -

- Edit pages/popup/src/Popup.tsx and save to reload. -

- - Learn React! - - Toggle theme -
-
- ); -}; + const saveSettings = useCallback(() => { + subtitleSettingStorage.saveSettings({ + color, + background, + font, + spacing, + stroke, + size, + }); + }, [color, background, font, spacing, stroke, size]); -const ToggleButton = (props: ComponentPropsWithoutRef<'button'>) => { - const theme = useStorageSuspense(exampleThemeStorage); return ( - +
+
+ smartCC logo + + +
+ {activeView === 'home' && ( +
+

SmartCC

+

+ Generate AI-powered closed captions that emphasize background music and sound effects. +

+
+ + +
+
+ )} + {activeView === 'options' && ( +
+

Subtitle Options

+

Customize your subtitles to match your preferences.

+
+
+ + +
+
+ + setSize(Number(e.target.value))} + /> +
+
+ +
+ setColor(e.target.value)} + style={{ padding: '0', margin: '0' }} + /> +
+
+ {color.toUpperCase()} +
+
+
+
+ +
+ setBackground(e.target.value)} + style={{ padding: '0', margin: '0' }} + /> +
+
+ {background.toUpperCase()} +
+
+
+
+ + setStroke(Number(e.target.value))} + /> +
+
+ + setSpacing(Number(e.target.value))} + /> +
+
+
+ + +
+
+ )} +
); }; -export default withErrorBoundary(withSuspense(Popup,
Loading ...
),
Error Occur
); +export default withErrorBoundary(withSuspense(Popup,
Loading...
),
Error Occur
); diff --git a/pages/popup/src/index.css b/pages/popup/src/index.css index ec439bb..a3f26a6 100644 --- a/pages/popup/src/index.css +++ b/pages/popup/src/index.css @@ -24,8 +24,6 @@ } body { - width: 450px; - height: 500px; margin: 0; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;