-
Notifications
You must be signed in to change notification settings - Fork 1
refactor: full app rehaul — route-based architecture, component extraction, and UI unification #61
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from all commits
Commits
Show all changes
61 commits
Select commit
Hold shift + click to select a range
78aae55
refactor: Phase 1 - foundation utilities and cleanup
aramb-dev e96ee1a
refactor: Phase 2 - Zustand stores for options and history
aramb-dev f42f0fe
refactor: Phase 3 - route-based architecture
aramb-dev 54124d4
refactor: Phase 4 - extract studio components from TranscriptionStudio
aramb-dev e7b6a18
refactor: Phase 5 - merge mobile/desktop duplicates
aramb-dev 60b0fb4
refactor: Phase 6 - design token overhaul
aramb-dev 27756cc
refactor: Phase 7 - cleanup and polish
aramb-dev f6c8fce
fix(studio): use AssemblyAI audio URL as source of truth
aramb-dev 7d7d5ab
feat(app): refresh support pages and feedback telemetry
aramb-dev 54745f8
chore(app): refresh dependencies and simplify legal pages
aramb-dev 16d3c51
fix(feedback): scale modal embed to fit the viewport
aramb-dev 20a543b
feat(ui): improve mobile nav and docs layout
aramb-dev dd95822
docs(changelog): add 3.4.0 release notes
aramb-dev 64d4278
fix(app): address TypeScript and SSR safety issues across components
aramb-dev 3914275
fix(studio): replace hardcoded blue values with design tokens in Audi…
aramb-dev 823538e
fix(history): patch completed entry instead of overwriting with defaults
aramb-dev a15242b
fix(history): migrate completed sessions to history store on DB upgrade
aramb-dev b3bd909
fix(storage): key audio URL in localStorage by prediction ID
aramb-dev ef2b1ce
fix(export): prevent invalid SRT/VTT timestamps when ms rounds to 1000
aramb-dev 6c23e77
fix(export): correct wordCount for empty/whitespace-only transcriptions
aramb-dev d6e1710
fix(studio): escape regex metacharacters in transcript search term
aramb-dev 6f47b04
fix(utils): treat 0 seconds as a valid duration in formatDuration
aramb-dev 2a2c43b
fix(utils): treat 0 bytes as a valid size in formatFileSize
aramb-dev b032c9f
fix(studio): hash full speaker string for stable, always-valid color …
aramb-dev 1bb731d
fix(history): persist failed status to IndexedDB on all failure paths
aramb-dev 447bd07
fix(a11y): make history cards keyboard-operable with role, tabIndex, …
aramb-dev 6bb86bd
fix(history): treat 'starting' status as in-progress, not failure
aramb-dev 26c4e66
fix(upload): guard handleUpload against concurrent double-submits wit…
aramb-dev 220136f
fix(feedback): build Tally embed URL from allowlist only, drop raw qu…
aramb-dev c3b0811
fix(studio): skip setIsLoading in finally when a redirect already occ…
aramb-dev 9af4d30
fix(studio): use useSearchParams for redirect to prevent empty-state …
aramb-dev 1441bd2
fix(transcribe): clear existing poll interval before restarting in ha…
aramb-dev 7b21f3d
fix(transcribe): correct word count for empty transcription in result UI
aramb-dev 690fe83
fix(studio): only set isPlaying true after play() resolves successfully
aramb-dev 5f6d890
fix(studio): always render A/B loop controls when audio is loaded
aramb-dev 50042fc
fix(export): reuse shared formatTimeForSRT/VTT from export-formats; f…
aramb-dev 205d79d
fix(export): include json, csv, and md in Download All Formats
aramb-dev 44b946a
fix(config): align success/warning tokens, move getStorage into try, …
aramb-dev 2bda566
fix(polling): track and clear initial poll setTimeout to prevent stal…
aramb-dev ee2e56e
fix(a11y): dialog semantics for shortcuts modal; guard audio shortcut…
aramb-dev 4b8e340
fix(quality): resolve 19 SonarQube code smells; fix Vercel npm build
aramb-dev 8644dcf
fix(i18n): use toLocaleLowerCase for locale-aware word frequency in s…
aramb-dev 77505fd
fix(hooks): extend interactive element guard; clear initial poll time…
aramb-dev c07103d
chore(tooling): add Biome — lint, format, CSS parser with Tailwind di…
aramb-dev 1ba22e7
chore: remove preview and setup-firebase-cors scripts
aramb-dev 550e991
chore(tooling): remove eslint and migrate to biome
aramb-dev 2fec190
build(config): update biome configuration and scripts
aramb-dev ad47214
refactor: optimize hooks and improve type safety
aramb-dev d3bb018
style(project): apply consistent formatting and code style updates
aramb-dev 3c9017a
refactor(core): reorganize imports and optimize hook logic
aramb-dev 3820415
feat(studio): enhance security and stability across core services
aramb-dev b4a11db
chore(config): ignore package-lock.json
aramb-dev 750553e
ci(github): add linting and type-checking workflows
aramb-dev 1c978f6
refactor(core): remove printerz proxy and unused pdf dependencies
aramb-dev 75acb6a
style(studio): reformat export controls markup
aramb-dev aff5a34
ci(github): update workflow branch syntax
aramb-dev f4842d7
refactor(core): improve security, stability, and code organization
aramb-dev e095f40
refactor: improve security, stability, and data integrity
aramb-dev 109479a
chore: resolve merge conflict — keep package-lock.json deleted (proje…
aramb-dev e546853
security(server): disable x-powered-by header
aramb-dev dff58b4
chore(server): remove unnecessary console log
aramb-dev File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,28 @@ | ||
| name: Biome | ||
|
|
||
| on: | ||
| push: | ||
| branches: | ||
| - "**" | ||
| pull_request: | ||
| branches: | ||
| - "**" | ||
|
|
||
| jobs: | ||
| biome: | ||
| name: biome ci | ||
| runs-on: ubuntu-latest | ||
|
|
||
| steps: | ||
| - uses: actions/checkout@v4 | ||
|
|
||
| - uses: oven-sh/setup-bun@v2 | ||
| with: | ||
| bun-version: "1.x" | ||
| cache: true | ||
|
|
||
| - name: Install dependencies | ||
| run: bun install --frozen-lockfile | ||
|
|
||
| - name: Lint & format check | ||
| run: bun run ci | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,28 @@ | ||
| name: Typecheck | ||
|
|
||
| on: | ||
| push: | ||
| branches: | ||
| - "**" | ||
| pull_request: | ||
| branches: | ||
| - "**" | ||
|
|
||
| jobs: | ||
| typecheck: | ||
| name: tsc --noEmit | ||
| runs-on: ubuntu-latest | ||
|
|
||
| steps: | ||
| - uses: actions/checkout@v4 | ||
|
|
||
| - uses: oven-sh/setup-bun@v2 | ||
| with: | ||
| bun-version: "1.x" | ||
| cache: true | ||
|
|
||
| - name: Install dependencies | ||
| run: bun install --frozen-lockfile | ||
|
coderabbitai[bot] marked this conversation as resolved.
|
||
|
|
||
| - name: Type check | ||
| run: bun x tsc --noEmit --ignoreDeprecations 6.0 | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -11,6 +11,7 @@ node_modules | |
| dist | ||
| dist-ssr | ||
| *.local | ||
| package-lock.json | ||
|
|
||
| # Editor directories and files | ||
| .vscode/* | ||
|
|
||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,311 @@ | ||
| { | ||
| "$schema": "https://biomejs.dev/schemas/2.4.13/schema.json", | ||
| "vcs": { "enabled": true, "clientKind": "git", "useIgnoreFile": true }, | ||
| "files": { "ignoreUnknown": false }, | ||
| "formatter": { | ||
| "enabled": true, | ||
| "formatWithErrors": false, | ||
| "indentStyle": "space", | ||
| "indentWidth": 2, | ||
| "lineEnding": "lf", | ||
| "lineWidth": 80, | ||
| "attributePosition": "auto", | ||
| "bracketSameLine": false, | ||
| "bracketSpacing": true, | ||
| "expand": "auto", | ||
| "useEditorconfig": true | ||
| }, | ||
| "linter": { | ||
| "enabled": true, | ||
| "rules": { | ||
| "recommended": false, | ||
| "complexity": { | ||
| "noAdjacentSpacesInRegex": "error", | ||
| "noExtraBooleanCast": "error", | ||
| "noUselessCatch": "error", | ||
| "noUselessEscapeInRegex": "error", | ||
| "noUselessTypeConstraint": "error" | ||
| }, | ||
| "correctness": { | ||
| "noConstAssign": "error", | ||
| "noConstantCondition": "error", | ||
| "noEmptyCharacterClassInRegex": "error", | ||
| "noEmptyPattern": "error", | ||
| "noGlobalObjectCalls": "error", | ||
| "noInvalidBuiltinInstantiation": "error", | ||
| "noInvalidConstructorSuper": "error", | ||
| "noNonoctalDecimalEscape": "error", | ||
| "noPrecisionLoss": "error", | ||
| "noSelfAssign": "error", | ||
| "noSetterReturn": "error", | ||
| "noSwitchDeclarations": "error", | ||
| "noUndeclaredVariables": "error", | ||
| "noUnreachable": "error", | ||
| "noUnreachableSuper": "error", | ||
| "noUnsafeFinally": "error", | ||
| "noUnsafeOptionalChaining": "error", | ||
| "noUnusedLabels": "error", | ||
| "noUnusedPrivateClassMembers": "error", | ||
| "noUnusedVariables": "error", | ||
| "useIsNan": "error", | ||
| "useValidForDirection": "error", | ||
| "useValidTypeof": "error", | ||
| "useYield": "error" | ||
| }, | ||
| "style": { | ||
| "noCommonJs": "error", | ||
| "noNamespace": "error", | ||
| "useArrayLiterals": "error", | ||
| "useAsConstAssertion": "error" | ||
| }, | ||
| "suspicious": { | ||
| "noAsyncPromiseExecutor": "error", | ||
| "noCatchAssign": "error", | ||
| "noClassAssign": "error", | ||
| "noCompareNegZero": "error", | ||
| "noConstantBinaryExpressions": "error", | ||
| "noControlCharactersInRegex": "error", | ||
| "noDebugger": "error", | ||
| "noDuplicateCase": "error", | ||
| "noDuplicateClassMembers": "error", | ||
| "noDuplicateElseIf": "error", | ||
| "noDuplicateObjectKeys": "error", | ||
| "noDuplicateParameters": "error", | ||
| "noEmptyBlockStatements": "error", | ||
| "noExplicitAny": "error", | ||
| "noExtraNonNullAssertion": "error", | ||
| "noFallthroughSwitchClause": "error", | ||
| "noFunctionAssign": "error", | ||
| "noGlobalAssign": "error", | ||
| "noImportAssign": "error", | ||
| "noIrregularWhitespace": "error", | ||
| "noMisleadingCharacterClass": "error", | ||
| "noMisleadingInstantiator": "error", | ||
| "noNonNullAssertedOptionalChain": "error", | ||
| "noPrototypeBuiltins": "error", | ||
| "noRedeclare": "error", | ||
| "noShadowRestrictedNames": "error", | ||
| "noSparseArray": "error", | ||
| "noUnassignedVariables": "error", | ||
| "noUnsafeDeclarationMerging": "error", | ||
| "noUnsafeNegation": "error", | ||
| "noUnusedExpressions": "off", | ||
| "noUselessRegexBackrefs": "error", | ||
| "noWith": "error", | ||
| "useGetterReturn": "error", | ||
| "useNamespaceKeyword": "error" | ||
| } | ||
| }, | ||
| "includes": ["**", "!dist", "!.next", "!node_modules"] | ||
| }, | ||
| "javascript": { | ||
| "formatter": { | ||
| "jsxQuoteStyle": "double", | ||
| "quoteProperties": "asNeeded", | ||
| "trailingCommas": "all", | ||
| "semicolons": "asNeeded", | ||
| "arrowParentheses": "always", | ||
| "bracketSameLine": false, | ||
| "quoteStyle": "double", | ||
| "attributePosition": "auto", | ||
| "bracketSpacing": true | ||
| }, | ||
| "globals": [] | ||
| }, | ||
| "css": { | ||
| "parser": { | ||
| "cssModules": false, | ||
| "allowWrongLineComments": true, | ||
| "tailwindDirectives": true | ||
| }, | ||
| "linter": { "enabled": true }, | ||
| "formatter": { "enabled": true } | ||
| }, | ||
| "html": { | ||
| "formatter": { | ||
| "indentScriptAndStyle": false, | ||
| "selfCloseVoidElements": "always" | ||
| } | ||
| }, | ||
| "overrides": [ | ||
| { | ||
| "includes": ["**/*.ts", "**/*.tsx", "**/*.mts", "**/*.cts"], | ||
| "linter": { | ||
| "rules": { | ||
| "complexity": { "noArguments": "error" }, | ||
| "correctness": { | ||
| "noConstAssign": "off", | ||
| "noGlobalObjectCalls": "off", | ||
| "noInvalidBuiltinInstantiation": "off", | ||
| "noInvalidConstructorSuper": "off", | ||
| "noSetterReturn": "off", | ||
| "noUndeclaredVariables": "off", | ||
| "noUnreachable": "off", | ||
| "noUnreachableSuper": "off" | ||
| }, | ||
| "style": { "useConst": "error" }, | ||
| "suspicious": { | ||
| "noClassAssign": "off", | ||
| "noDuplicateClassMembers": "off", | ||
| "noDuplicateObjectKeys": "off", | ||
| "noDuplicateParameters": "off", | ||
| "noFunctionAssign": "off", | ||
| "noImportAssign": "off", | ||
| "noRedeclare": "off", | ||
| "noUnsafeNegation": "off", | ||
| "noVar": "error", | ||
| "noWith": "off", | ||
| "useGetterReturn": "off" | ||
| } | ||
| } | ||
| } | ||
| }, | ||
| { | ||
| "includes": ["**/*.{js,jsx,ts,tsx}"], | ||
| "javascript": { | ||
| "globals": [ | ||
| "onanimationend", | ||
| "exports", | ||
| "ongamepadconnected", | ||
| "onlostpointercapture", | ||
| "onanimationiteration", | ||
| "onkeyup", | ||
| "onmousedown", | ||
| "onanimationstart", | ||
| "onslotchange", | ||
| "onprogress", | ||
| "ontransitionstart", | ||
| "onpause", | ||
| "onended", | ||
| "onpointerover", | ||
| "onscrollend", | ||
| "onformdata", | ||
| "ontransitionrun", | ||
| "onanimationcancel", | ||
| "ondrag", | ||
| "onchange", | ||
| "onbeforeinstallprompt", | ||
| "onbeforexrselect", | ||
| "onmessage", | ||
| "ontransitioncancel", | ||
| "onpointerdown", | ||
| "onabort", | ||
| "onpointerout", | ||
| "oncuechange", | ||
| "ongotpointercapture", | ||
| "onscrollsnapchanging", | ||
| "onsearch", | ||
| "onsubmit", | ||
| "onstalled", | ||
| "onsuspend", | ||
| "onreset", | ||
| "onerror", | ||
| "onresize", | ||
| "onmouseenter", | ||
| "ongamepaddisconnected", | ||
| "ondragover", | ||
| "onbeforetoggle", | ||
| "onmouseover", | ||
| "onpagehide", | ||
| "onmousemove", | ||
| "onratechange", | ||
| "oncommand", | ||
| "onmessageerror", | ||
| "onwheel", | ||
| "ondevicemotion", | ||
| "onauxclick", | ||
| "ontransitionend", | ||
| "onpaste", | ||
| "onpageswap", | ||
| "ononline", | ||
| "ondeviceorientationabsolute", | ||
| "onkeydown", | ||
| "onclose", | ||
| "onselect", | ||
| "onpageshow", | ||
| "onpointercancel", | ||
| "onbeforematch", | ||
| "onpointerrawupdate", | ||
| "ondragleave", | ||
| "onscrollsnapchange", | ||
| "onseeked", | ||
| "onwaiting", | ||
| "onbeforeunload", | ||
| "onplaying", | ||
| "onvolumechange", | ||
| "ondragend", | ||
| "onstorage", | ||
| "onloadeddata", | ||
| "onfocus", | ||
| "onoffline", | ||
| "onplay", | ||
| "onafterprint", | ||
| "onclick", | ||
| "oncut", | ||
| "onmouseout", | ||
| "ondblclick", | ||
| "oncanplay", | ||
| "onloadstart", | ||
| "onappinstalled", | ||
| "onpointermove", | ||
| "ontoggle", | ||
| "oncontextmenu", | ||
| "onblur", | ||
| "oncancel", | ||
| "onbeforeprint", | ||
| "oncontextrestored", | ||
| "onloadedmetadata", | ||
| "onpointerup", | ||
| "onlanguagechange", | ||
| "oncopy", | ||
| "onselectstart", | ||
| "onscroll", | ||
| "onload", | ||
| "ondragstart", | ||
| "onbeforeinput", | ||
| "oncanplaythrough", | ||
| "oninput", | ||
| "oninvalid", | ||
| "ontimeupdate", | ||
| "ondurationchange", | ||
| "onselectionchange", | ||
| "onmouseup", | ||
| "location", | ||
| "onkeypress", | ||
| "onpointerleave", | ||
| "oncontextlost", | ||
| "ondrop", | ||
| "onsecuritypolicyviolation", | ||
| "oncontentvisibilityautostatechange", | ||
| "ondeviceorientation", | ||
| "onseeking", | ||
| "onrejectionhandled", | ||
| "onunload", | ||
| "onmouseleave", | ||
| "onhashchange", | ||
| "onpointerenter", | ||
| "onmousewheel", | ||
| "onunhandledrejection", | ||
| "ondragenter", | ||
| "onpopstate", | ||
| "onpagereveal", | ||
| "onemptied" | ||
| ] | ||
| }, | ||
| "linter": { | ||
| "rules": { | ||
| "correctness": { | ||
| "noUnusedVariables": "error", | ||
| "useExhaustiveDependencies": "warn", | ||
| "useHookAtTopLevel": "error" | ||
| } | ||
| } | ||
| } | ||
| }, | ||
| { "includes": ["**/*.cjs"], "javascript": { "globals": ["exports"] } } | ||
| ], | ||
| "assist": { | ||
| "enabled": true, | ||
| "actions": { "source": { "organizeImports": "on" } } | ||
| } | ||
| } |
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.