93b482871f
Require authentication to participate in chat ( #4762 )
...
* feat(chat): require authentication to participate in chat
* fix: it's pretty much impossible to bypass the auth requirement, addressing review feedback anyway
* feat(chat): render chat text input as disabled if chat auth is required
* Commit updated API documentation
---------
Co-authored-by: Owncast <owncast@owncast.online >
2026-01-28 11:49:07 -08:00
John Costa and GitHub
1cdbde58f5
fix: remove optimistic UI updates in external actions to prevent race condition ( #4711 )
...
When adding/deleting external actions, the UI would sometimes show
duplicated or cloned rows due to a race condition between:
1. The optimistic setActions() call updating local state
2. The save() callback updating externalActions in context
3. The useEffect syncing actions from externalActions
This fix removes the optimistic updates and lets the server response
be the single source of truth, updating the UI only after the context
is updated via the save() success callback.
Fixes #4347
2026-01-17 14:44:33 -08:00
05341aced0
feat: add readonly-chat class to readonly embed ( #4714 )
...
Adds a 'readonly' prop to ChatContainer that conditionally applies a
'readonly-chat' CSS class to the chat container element. This allows
streamers using OBS to target the readonly chat embed with custom CSS.
The readonly embed at /embed/chat/readonly now passes readonly={true}
to ChatContainer, which adds the class to the container div.
Fixes #4266
Co-authored-by: Gabe Kangas <gabek@real-ity.com >
2026-01-03 13:04:51 -08:00
80850b15d0
feat: Adds a webhook for when a user follows the stream ( #4362 )
...
* feat: Adds a webhook for when a user follow the stream
Frontend:
Adds a checkbox which renders only when social features are enabled.
Backend:
- Defines a new type for the event
- Implements the webhook including unit testing
- Fires the webhook inside the ApproveFollower handler
* Removes unnecessary Type fiels from Events struct
* refactor: renames SendUserFollowedEvent func to FediverseEngagementFollow and fixes linting errors
* fix: fixes unit test to reflect removed Type field from FediverseEngagementFollowEvent
* feat: fires webhook also when manual approvals are not required
* chore: slight cleanup
---------
Co-authored-by: Gabe Kangas <gabek@real-ity.com >
2025-11-21 13:47:50 -08:00
Amisha and GitHub
8c016b85dd
fix: X-axis labels and ticks ( #4664 )
...
* fix: X-axis labels and ticks
* use TimeWindow enum instead of int
* format with Prettier
2025-11-10 13:48:01 -08:00
383b80851b
Add localization support to admin status and error messages ( #4631 )
...
* Initial plan
* Add localization support to admin form status and error messages
Co-authored-by: gabek <414923+gabek@users.noreply.github.com >
* Format updated files with prettier
Co-authored-by: gabek <414923+gabek@users.noreply.github.com >
* Replace t() with Translation component in admin page JSX
Co-authored-by: gabek <414923+gabek@users.noreply.github.com >
* update package-lock.json
* Update web/i18n/en/translation.json
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com >
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com >
Co-authored-by: gabek <414923+gabek@users.noreply.github.com >
Co-authored-by: Gabe Kangas <gabek@real-ity.com >
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com >
2025-10-13 16:29:40 -07:00
1cf923a5af
Update localization files + references ( #4556 )
...
* Initial plan
* Add localization support to NameChangeModal component
Co-authored-by: gabek <414923+gabek@users.noreply.github.com >
* Add NameChangeModal translations to English language file
Co-authored-by: gabek <414923+gabek@users.noreply.github.com >
* fix(i18n): fix localization keys
* chore(test): add i18n test
* chore(i18n): update translation script
* chore(i18n): reorgnize translation keys and update components
* chore: fix linting warnings
* chore(i18n): update all the language files
* feat(i18n): add last live ago i18n key
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com >
Co-authored-by: gabek <414923+gabek@users.noreply.github.com >
Co-authored-by: Gabe Kangas <gabek@real-ity.com >
2025-09-15 19:27:56 -07:00
29b5100114
Create custom Translation component for better i18n handling ( #4431 )
...
* Initial plan
* Implement Translation component with Storybook stories
Co-authored-by: gabek <414923+gabek@users.noreply.github.com >
* Add Jest test for Translation component and demonstrate ?lang=de functionality
Co-authored-by: gabek <414923+gabek@users.noreply.github.com >
* Javascript formatting autofixes
* Create centralized type-safe localization system
Co-authored-by: gabek <414923+gabek@users.noreply.github.com >
* Add @testing-library/react to Translation component tests
Co-authored-by: gabek <414923+gabek@users.noreply.github.com >
* Fix code formatting errors with prettier and eslint
Co-authored-by: gabek <414923+gabek@users.noreply.github.com >
* Revert "Fix code formatting errors with prettier and eslint"
Co-authored-by: gabek <414923+gabek@users.noreply.github.com >
* fix(js): eslinter errors
* fix(js): unused code warnings
* fix(js): fix additional warnings
* Update Emoji admin page to use new Translation component
Co-authored-by: gabek <414923+gabek@users.noreply.github.com >
* Organize localization keys by logical sections (Frontend, Admin, Common, Testing)
Co-authored-by: gabek <414923+gabek@users.noreply.github.com >
* Organize localization keys by TypeScript namespaces
Co-authored-by: gabek <414923+gabek@users.noreply.github.com >
* Javascript formatting autofixes
* feat(js): add support for default translated text
* chore: add default lang translations on commit
* fix(js): unused code warnings
* Update OfflineBanner component to use new Translation component
Co-authored-by: gabek <414923+gabek@users.noreply.github.com >
* fix(js): fix localization extraction job
* chore(js): remove ts-node cli
* fix(css): fix css warning
* feat(js): add some additional translation strings via component
* chore: update extracted translations
* test: add tests for Translation component defaultText and fallback behavior
Co-authored-by: gabek <414923+gabek@users.noreply.github.com >
* chore: update extracted translations
* Javascript formatting autofixes
* chore: call out new Translation component
* fix: linter warning
* chore: updated instructions
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com >
Co-authored-by: gabek <414923+gabek@users.noreply.github.com >
Co-authored-by: Owncast <owncast@owncast.online >
Co-authored-by: Gabe Kangas <gabek@real-ity.com >
2025-07-13 02:21:46 -07:00
Michael and GitHub
c981acbc5d
Fix issue #4042 : Add paragraph in admin emoji page to link to documentation ( #4235 )
...
* Fix issue #4042 : Add paragraph in admin emoji page to link to documentation
* Address some code formatting issues
* Fixed html style issue
2025-03-09 17:22:29 -07:00
ed5186a280
Added changes for Issue 4044 ( #4199 )
...
* Added changes for fix 4044
* Fixed spacing issue
---------
Co-authored-by: Gabe Kangas <gabek@real-ity.com >
2025-02-11 15:40:11 -08:00
cb387d88be
Initial localization work ( #3980 )
...
* First pass at configuring localization
* Add CI job for translations
* Update CI job
* Update default value
* Update parser config
* Update defaults again
* try to fix the multiple parsing of a file
* Update crowdlin config
* Update configs
* New Crowdin translations by GitHub Action (#3448 )
Co-authored-by: Crowdin Bot <support+bot@crowdin.com >
* Point to updated translated files
* Tooltip i18n
* Run translation job when web components are updated
* Commit updated translations
* Translations update (#3453 )
* Update source file strings.json
Updated translations
* New translations strings.json (French)
Updated translations
* New translations strings.json (Spanish)
Updated translations
* New translations strings.json (German)
Updated translations
* New translations strings.json (English, United States)
Updated translations
* Commit updated translations
* New Crowdin translations by GitHub Action (#3452 )
Co-authored-by: Owncast <owncast@owncast.online >
* chore(deps): update to next config to address build errors
* New Crowdin translations by GitHub Action (#3455 )
Co-authored-by: Crowdin Bot <support+bot@crowdin.com >
* Translations update (#3456 )
* New translations strings.json (Arabic)
Updated translations
* New translations strings.json (German)
Updated translations
* New translations strings.json (Greek)
Updated translations
* New translations strings.json (Irish)
Updated translations
* New translations strings.json (Italian)
Updated translations
* New translations strings.json (Japanese)
Updated translations
* New translations strings.json (Korean)
Updated translations
* New translations strings.json (Dutch)
Updated translations
* New translations strings.json (Norwegian)
Updated translations
* New translations strings.json (Punjabi)
Updated translations
* New translations strings.json (Russian)
Updated translations
* New translations strings.json (Swedish)
Updated translations
* New translations strings.json (Chinese Traditional)
Updated translations
* New translations strings.json (Vietnamese)
Updated translations
* New translations strings.json (Bengali)
Updated translations
* New translations strings.json (Thai)
Updated translations
* New translations strings.json (Croatian)
Updated translations
* New translations strings.json (Hindi)
Updated translations
* New translations strings.json (Malay)
Updated translations
* New Crowdin translations by GitHub Action (#3457 )
* New translations strings.json (Arabic)
Updated translations
* New translations strings.json (German)
Updated translations
* New translations strings.json (Greek)
Updated translations
* New translations strings.json (Irish)
Updated translations
* New translations strings.json (Italian)
Updated translations
* New translations strings.json (Japanese)
Updated translations
* New translations strings.json (Korean)
Updated translations
* New translations strings.json (Dutch)
Updated translations
* New translations strings.json (Norwegian)
Updated translations
* New translations strings.json (Punjabi)
Updated translations
* New translations strings.json (Russian)
Updated translations
* New translations strings.json (Swedish)
Updated translations
* New translations strings.json (Chinese Traditional)
Updated translations
* New translations strings.json (Vietnamese)
Updated translations
* New translations strings.json (Bengali)
Updated translations
* New translations strings.json (Thai)
Updated translations
* New translations strings.json (Croatian)
Updated translations
* New translations strings.json (Hindi)
Updated translations
* New translations strings.json (Malay)
Updated translations
* New Crowdin translations by GitHub Action
---------
Co-authored-by: Gabe Kangas <gabek@real-ity.com >
Co-authored-by: Crowdin Bot <support+bot@crowdin.com >
* Commit updated API documentation
* Update translations job
* New Crowdin translations by GitHub Action (#3698 )
Co-authored-by: Crowdin Bot <support+bot@crowdin.com >
* Update Crowdin configuration file
* Translations update (#3700 )
* New translations strings.json (French)
Updated translations
* New translations strings.json (Italian)
Updated translations
* Translations update (#3699 )
* New translations strings.json (French)
Updated translations
* New translations strings.json (Spanish)
Updated translations
* New translations strings.json (Italian)
Updated translations
* New translations strings.json (Japanese)
Updated translations
* New translations strings.json (Polish)
Updated translations
* New translations strings.json (Russian)
Updated translations
* New translations strings.json (Portuguese, Brazilian)
Updated translations
* Commit updated API documentation
---------
Co-authored-by: Owncast <owncast@owncast.online >
* New Crowdin translations by GitHub Action (#3701 )
* New translations strings.json (French)
Updated translations
* New translations strings.json (Spanish)
Updated translations
* New translations strings.json (Italian)
Updated translations
* New translations strings.json (Japanese)
Updated translations
* New translations strings.json (Polish)
Updated translations
* New translations strings.json (Russian)
Updated translations
* New translations strings.json (Portuguese, Brazilian)
Updated translations
* New Crowdin translations by GitHub Action
---------
Co-authored-by: Gabe Kangas <gabek@real-ity.com >
Co-authored-by: Crowdin Bot <support+bot@crowdin.com >
* Draft: Mark strings for translation. (#3458 )
* Mark strings for translation.
* Mark up strings for translation
* fix(web): fix linter warnings
---------
Co-authored-by: Le fractal <17422-fractal@users.noreply.framagit.org >
Co-authored-by: Gabe Kangas <gabek@real-ity.com >
* do not pull from cowdin via workflow
* Commit updated translations
* feat: add translations support to admin pages and components (#3977 )
* feat: add translations support to admin pages and components
Added translations support admin main page and its components, help
page, handware-info page. Added translations support for LogTable,
NewsFeed and StreamHealthOverview components.
* update package.json
* fix rendering issue
* Commit updated API documentation
---------
Co-authored-by: Owncast <owncast@owncast.online >
Co-authored-by: Gabe Kangas <gabek@real-ity.com >
* Offline banner i18n formatting (#3997 )
* Fix "Last live ago" string formatting with i18n interpolation
* Change some base translation jsons to use i18n interpolation
* Linting fix
* chore(js): ignore i18n pkgs in knip
* fix(test): fix browser ui test
* fix(js): remove unused var
---------
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Crowdin Bot <support+bot@crowdin.com >
Co-authored-by: Owncast <owncast@owncast.online >
Co-authored-by: taintedcypher <119351153+taintedcypher@users.noreply.github.com >
Co-authored-by: Le fractal <17422-fractal@users.noreply.framagit.org >
Co-authored-by: Sufyaan Khateeb <81009832+SufyaanKhateeb@users.noreply.github.com >
Co-authored-by: mahmed2000 <mahmad2000@protonmail.com >
2025-01-14 20:54:21 -08:00
Gabe Kangas
8ffbf23d4e
fix(js): fix social switch not actually turning on feature. Closes #4055
2024-12-12 22:33:37 -08:00
Gabe Kangas and GitHub
446d5db085
fix(js): fix followers table being empty when sorted. Closes #3799 ( #4054 )
2024-12-12 21:40:24 -08:00
f59ac63dfe
fix(social): set federation enabled state after confirmation ( #4038 )
...
* feat(integerations): add route to get user details
* Commit updated API documentation
* test(integrations): implement unit test for get user details
* fix(social): set federation enabled state after confirmation
set federation enabled state only after confirmation in modal
* Javascript formatting autofixes
* chore(social): use variable instead of explicitly setting path value
* Javascript formatting autofixes
---------
Co-authored-by: Owncast <owncast@owncast.online >
Co-authored-by: Gabe Kangas <gabek@real-ity.com >
2024-11-30 12:32:13 -08:00
f6a1b1b638
chore(deps): update typescript-eslint monorepo to v8 (major) ( #3887 )
...
* chore(deps): update typescript-eslint monorepo to v8
* chore(js): fix linter errors
---------
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Gabe Kangas <gabek@real-ity.com >
2024-09-15 13:51:33 -07:00
Gabe Kangas and GitHub
a450e62397
Optionally disable chat rate limiter and add optional chat slur/language filter ( #3681 )
...
* feat(chat): basic profanity filter. For #3139
* feat(chat): add setting for disabling chat spam protection. Closes #3523
* feat(chat): wire up the new chat slur filter to admin and chat. Closes #3139
2024-04-09 22:25:41 -07:00
Gabe Kangas
46d0be3e6d
fix(web): fix incorrect image
2024-03-06 21:55:49 -08:00
44eafe69ac
fix(deps): update dependency date-fns to v3 ( #3619 )
...
* fix(deps): update dependency date-fns to v3
* fix(deps): update usage of date-fns format
---------
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Gabe Kangas <gabek@real-ity.com >
2024-03-06 21:13:13 -08:00
Gabe Kangas and GitHub
5ce78fbad4
New offline embed ( #3599 )
...
* WIP
* feat(web): add new offline embed view. First step of #2917
* feat(web): support remote fediverse follow flow from embed
* feat(chore): add back offline video embed browser test
2024-02-25 12:52:32 -08:00
Gabe Kangas
82d0b9c121
fix(web): make video embed player fit entire window. Closes #3587
2024-02-21 20:41:25 -08:00
Gabe Kangas
7b783ac00e
fix(admin): fix admin followers pagination. Closes #3510
2024-02-18 19:14:20 -08:00
Varun Gujarathi and GitHub
b694be1052
fix(admin): sanitize fediverse username ( #3437 )
...
* test: add config federation test
* fix: santize fediverse username
fixes #3424
* refactor: remove commented code
* refactor: change username const to usernameValue
* refactor: use shorthand property
* build: move stories page out of build directory
* fix: allow only alphanumeric chars in username
* fix: filter out special chars in username
Added a regex filter to strip non-alphanumeric chars in username field.
* chore: clean unused fields
2024-02-05 20:00:50 -08:00
Aziz Rmadi and GitHub
6c644330e7
Fixed page size stale state on LogTable component ( #3516 )
2024-01-22 20:31:23 -08:00
b28b027ead
chore(deps): update dependency typescript to v5 ( #3387 )
...
* chore(deps): update dependency typescript to v5
* fix: resolve type mismatch
* Commit updated API documentation
---------
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Gabe Kangas <gabek@real-ity.com >
Co-authored-by: Owncast <owncast@owncast.online >
2023-10-25 21:52:36 -07:00
Patrick Bollinger and GitHub
9a7925444f
Fix embedded status bar being cut off ( #3352 )
...
* Fix embedded status bar being cut off
This should resolve https://github.com/owncast/owncast/issues/3210 .
As recommended in the discussion, flexbox was the way to solve this issue.
The main thing that needed to be addressed though was not applying too many constraints on the OwncastPlayer component just because it was embedded.
By removing the embedded constraints, styling appears to be working as expected.
I'll attach screenshots to the pull request.
* Fix eslint error
2023-10-21 21:46:10 -07:00
Gabe Kangas and GitHub
169c11596c
feat(chat): add support for chat part messages. Closes #3201 ( #3291 )
2023-09-10 10:58:11 -07:00
Gabe Kangas
243156b307
chore: address linter warnings
2023-08-02 13:46:00 -07:00
Ikko Eltociear Ashimine and GitHub
0fb821b33c
Fix typo in actions.tsx ( #3225 )
...
alway -> always
2023-07-31 10:44:48 -07:00
7c13a3fd01
chore(deps): update dependency eslint-plugin-react to v7.33.0 ( #3205 )
...
* chore(deps): update dependency eslint-plugin-react to v7.33.0
* chore: have linter try to autofix and commit linter warnings
* Linter fixes
* chore: tweak how js formatting is run within actions
* fix: type mismatch
* Prettified Code!
---------
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Gabe Kangas <gabek@real-ity.com >
Co-authored-by: Owncast <owncast@owncast.online >
Co-authored-by: gabek <gabek@users.noreply.github.com >
2023-07-29 15:57:45 -07:00
8148f74736
Unhide dropdown in Viewer Info page ( #3173 )
...
Co-authored-by: janWilejan <>
2023-07-14 09:28:56 -07:00
janWilejan and GitHub
e15e2dc47c
Fix deprecated antd dropdown warnings ( #3171 )
...
* Fix deprecated antd dropdown warnings
2023-07-13 20:28:12 +00:00
46ca5223f9
Chat wire protocol ( #3125 )
...
* core: remove file extension from emoji name
* web: transform emotes to labels when sending
* chat: replace br with line break
* core: implement emoji cache
* chat: send shortcodes for custom emoji
* chat: correct esling errors
* core: move emoji injection into dedicated function
* emoji: integrate emoji into markdown renderer, fix formatting
* chat protocol: correct golangci-lint findings
* chat field: specify that the contentEditable is an HTMLElement
* admin: mention that emoji should have unique names
* Prettified Code!
* regenerate pack-lock
* chat: correct the emphasis tag, provide fallback for other elements
---------
Co-authored-by: jprjr <jprjr@users.noreply.github.com >
2023-07-05 17:25:47 -07:00
Gabe Kangas
ccb9b5d075
chore: run stylelint on our css files
2023-06-20 20:58:00 -07:00
Gabe Kangas
cc953f154e
fix(admin): fix typo causing established chat mode display bug. Closes #3070
2023-06-05 16:47:08 -07:00
0ff30d44e4
fix: hide latency card for admin if latency is 0 ( #3047 )
...
* hide latency card for admin if latency is 0
* Prettified Code!
---------
Co-authored-by: abhipanorian <abhipanorian@users.noreply.github.com >
2023-05-30 11:33:30 -07:00
Gabe Kangas and GitHub
e50b23d081
Cleanup unused Javascript ( #3027 )
...
* chore(js): be stricter about dead code warnings
* chore(js): remove dead code and unused exports
* rebase
* chore: remove unused files
* chore(deps): remove unused prop-types dep
* chore(js): remove unused function
* chore(deps): remove + check unused deps
* chore(js): remove unused exports. Closes #3036
2023-05-20 21:15:25 -07:00
fb36d32fa0
Fixes : Admin: Custom emoji page layout ( #2993 )
...
* Update emojis.tsx
* Prettified Code!
* Second Iteration
* Update emojis.tsx
* Putting Delete Button at top-right
Will this work ?
* Prettified Code!
* Update emojis.tsx
Changing Icon of Delete Button
Decreasing Delete-Button Size
* Prettified Code!
* Tweak style of delete emoji button
---------
Co-authored-by: dev265545 <dev265545@users.noreply.github.com >
Co-authored-by: Gabe Kangas <gabek@real-ity.com >
2023-05-07 12:57:15 -07:00
Gabe Kangas
8dbc8a07cf
feat(embeds): wrap chat embeds in error components
2023-05-06 14:11:23 -07:00
Gabe Kangas
d139cf08f5
fix(embeds): import custom theme into chat embeds
2023-05-05 12:21:20 -07:00
Gabe Kangas
7261b1d49f
fix(embed): allow flexible player sizes for embeds. Closes #2984
2023-05-04 11:29:48 -07:00
Gabe Kangas
f2fbce113e
fix(embed): set background color and height of chat embed. closes #2961
2023-04-27 10:26:12 -07:00
Gabe Kangas
1dc71004c9
fix(embed): set background color of video embed
2023-04-27 10:26:12 -07:00
Gabe Kangas
bb9cc28596
fix(embed): change text color of offline banner. Closes #2953
2023-04-26 09:40:17 -07:00
Gabe Kangas
b3ac4e1a15
fix(js): consolidate url and account validators
2023-04-16 14:32:18 -07:00
Gabe Kangas
7ec7e1704c
Add bool option to player to fill container for embeds. Closes #2884
2023-04-05 20:05:22 -07:00
07c5cabfe8
Trigger the title updated webhook event whenever a title is changed ( #2823 )
...
* wip: trigger the title updated webhook event whenever a title is changed
* Commit updated API documentation
* fix: add STREAM_TITLE_CHANGED to list of valid events
* feat: Add support for STREAM_TITLE_CHANGED webhook event on admin dashboard
* fix: transmit webhook event after stream has changed to fix race conditions where older title was sent
---------
Co-authored-by: Owncast <owncast@owncast.online >
2023-03-28 11:34:00 -07:00
Gabe Kangas
bb14af399e
Fix the listing of follower tables in admin
2023-03-22 14:54:43 -07:00
Gabe Kangas
a5e5adfa02
Fix incorrect follower count displayed. Closes #2854
2023-03-21 17:33:59 -07:00
Dhanu Saputra and GitHub
2b41113211
Loose div in Utilities > Stream health screen ( #2844 )
2023-03-21 13:06:16 -07:00
Gabe Kangas
6973c3d8df
Update styling of video settings admin page. Closes #2803
2023-03-14 21:34:37 -07:00