pstream is dead; long live pstream taciturnaxolotl.github.io/pstream-ng/
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

add userscript to onboarding and notif

Pas 18d60447 93c47366

+107 -77
+23
public/notifications.xml
··· 9 9 <atom:link href="https://pstream.mov/notifications.xml" rel="self" type="application/rss+xml" /> 10 10 11 11 <item> 12 + <guid>notification-053</guid> 13 + <title>New Userscript alternative to the extension!</title> 14 + <description>If you prefer to use a userscript instead of the extension, you now have the option! 15 + 16 + It should work almost exactly the same as the extension, but without the need to install an extension. Unfortunatly, our Firefox extension store page keeps getting taken down, so this is the alternative until we can get it back up or if you install the .xpi manually. 17 + 18 + Some things to note: 19 + 20 + - The extension is still the most reliable method! 21 + - This does not currently work in Safari or Orion due to Webkit’s limitations with webRequest APIs. :( 22 + 23 + Thanks to Duplicake for the incredible help building this! 24 + 25 + Use the link below to install the userscript into Violentmonkey or Tampermonkey! 26 + 27 + P.S. We're still working on getting some new sources online, so expect more updates soon! 28 + </description> 29 + <link>https://raw.githubusercontent.com/p-stream/Userscript/main/p-stream.user.js</link> 30 + <pubDate>Sun, 14 Dec 2025 15:00:00 MST</pubDate> 31 + <category>feature</category> 32 + </item> 33 + 34 + <item> 12 35 <guid>notification-052</guid> 13 36 <title>Thanks to everyone who has supported!</title> 14 37 <description>We've reached our goal of $300! Thanks to everyone who has supported and we'll be working hard to bring you new great things!
+2
src/assets/locales/en.json
··· 579 579 "extensionHelp": "If you've installed the extension but it's not detected, <bold>open the extension through your browsers extension menu</bold> and follow the steps on screen.", 580 580 "linkChrome": "Install Chrome extension", 581 581 "linkFirefox": "Install Firefox extension", 582 + "linkUserscript": "Alternative Userscript", 583 + "userscriptNote": "(The extension is more reliable than the userscript!)", 582 584 "notDetecting": "Installed on Chrome, but the site isn't detecting it? Try reloading the page!", 583 585 "notDetectingAction": "Reload page", 584 586 "status": {
+10
src/components/UserIcon.tsx
··· 22 22 WAND = "wand", 23 23 CLAPPER_BOARD = "clapper_board", 24 24 BOOKMARK = "bookmark", 25 + FIREFOX = "firefox", 26 + CHROME = "chrome", 27 + SAFARI = "safari", 28 + ORION = "orion", 29 + EDGE = "edge", 25 30 } 26 31 27 32 export interface UserIconProps { ··· 49 54 wand: `<svg width="1.2em" height="1.2em" viewBox="0 0 21 21" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M9.33437 4.33438L8.15625 4.775C8.0625 4.80937 8 4.9 8 5C8 5.1 8.0625 5.19062 8.15625 5.225L9.33437 5.66563L9.775 6.84375C9.80938 6.9375 9.9 7 10 7C10.1 7 10.1906 6.9375 10.225 6.84375L10.6656 5.66563L11.8438 5.225C11.9375 5.19062 12 5.1 12 5C12 4.9 11.9375 4.80937 11.8438 4.775L10.6656 4.33438L10.225 3.15625C10.1906 3.0625 10.1 3 10 3C9.9 3 9.80938 3.0625 9.775 3.15625L9.33437 4.33438ZM3.44062 15.3562C2.85625 15.9406 2.85625 16.8906 3.44062 17.4781L4.52187 18.5594C5.10625 19.1437 6.05625 19.1437 6.64375 18.5594L18.5594 6.64062C19.1438 6.05625 19.1438 5.10625 18.5594 4.51875L17.4781 3.44063C16.8937 2.85625 15.9437 2.85625 15.3562 3.44063L3.44062 15.3562ZM17.1438 5.58125L13.8625 8.8625L13.1344 8.13438L16.4156 4.85312L17.1438 5.58125ZM2.23438 6.6625C2.09375 6.71562 2 6.85 2 7C2 7.15 2.09375 7.28438 2.23438 7.3375L4 8L4.6625 9.76562C4.71562 9.90625 4.85 10 5 10C5.15 10 5.28438 9.90625 5.3375 9.76562L6 8L7.76562 7.3375C7.90625 7.28438 8 7.15 8 7C8 6.85 7.90625 6.71562 7.76562 6.6625L6 6L5.3375 4.23438C5.28438 4.09375 5.15 4 5 4C4.85 4 4.71562 4.09375 4.6625 4.23438L4 6L2.23438 6.6625ZM13.2344 14.6625C13.0938 14.7156 13 14.85 13 15C13 15.15 13.0938 15.2844 13.2344 15.3375L15 16L15.6625 17.7656C15.7156 17.9062 15.85 18 16 18C16.15 18 16.2844 17.9062 16.3375 17.7656L17 16L18.7656 15.3375C18.9062 15.2844 19 15.15 19 15C19 14.85 18.9062 14.7156 18.7656 14.6625L17 14L16.3375 12.2344C16.2844 12.0938 16.15 12 16 12C15.85 12 15.7156 12.0938 15.6625 12.2344L15 14L13.2344 14.6625Z" fill="currentColor"/></svg>`, 50 55 clapper_board: `<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 512 512"><!--! Font Awesome Pro 6.0.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. --><path fill="currentColor" d="M326.1 160l127.4-127.4C451.7 32.39 449.9 32 448 32h-86.06l-128 128H326.1zM166.1 160l128-128H201.9l-128 128H166.1zM497.7 56.19L393.9 160H512V96C512 80.87 506.5 67.15 497.7 56.19zM134.1 32H64C28.65 32 0 60.65 0 96v64h6.062L134.1 32zM0 416c0 35.35 28.65 64 64 64h384c35.35 0 64-28.65 64-64V192H0V416z"/></svg>`, 51 56 bookmark: `<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 384 512"><!--! Font Awesome Pro 6.0.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. --><path fill="currentColor" d="M384 48V512l-192-112L0 512V48C0 21.5 21.5 0 48 0h288C362.5 0 384 21.5 384 48z"/></svg>`, 57 + firefox: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640" width="1em" height="1em" fill="currentColor"><!--!Font Awesome Free v7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc.--><path d="M567.5 305.5C567.4 303.9 567.3 302.4 567.3 300.8L567.3 300.7L566.9 296L566.9 295.9C565.6 282 563.2 268.2 559.6 254.7C559.6 254.6 559.6 254.6 559.5 254.5L558.4 250.5C558.3 250.3 558.3 250 558.2 249.9C557.8 248.7 557.5 247.4 557.1 246.2C557 246 557 245.6 556.9 245.4C556.5 244.2 556.2 243 555.8 241.9C555.7 241.5 555.6 241.3 555.4 240.9C555 239.7 554.7 238.6 554.2 237.4L553.8 236.3C553.4 235.2 553 234 552.6 232.9C552.5 232.6 552.4 232.2 552.2 231.9C551.7 230.8 551.4 229.6 550.9 228.5C550.8 228.3 550.7 227.9 550.5 227.7C550 226.5 549.5 225.4 549.1 224.2C549.1 224.1 549 224 549 223.8C547.4 220 545.8 216.1 544 212.4L543.6 211.7C543.1 210.7 542.8 209.9 542.3 209.1C542.1 208.6 541.8 208 541.6 207.5C541.2 206.7 540.8 205.9 540.4 205.1C540 204.5 539.8 203.9 539.4 203.3C539 202.7 538.6 201.9 538.2 201C537.8 200.4 537.5 199.7 537.1 199.1C536.7 198.5 536.3 197.7 535.9 196.9C535.5 196.2 535.1 195.5 534.7 194.9C534.3 194.2 533.9 193.6 533.5 192.9C533.1 192.2 532.7 191.6 532.3 190.9C531.9 190.2 531.5 189.6 531.1 189C530.7 188.4 530.3 187.6 529.8 186.8C529.4 186.2 529 185.6 528.6 185L527.2 182.9C526.8 182.3 526.4 181.7 526 181.1C525.5 180.4 524.9 179.5 524.4 178.8C524 178.3 523.7 177.7 523.3 177.2L521.5 174.7C521.1 174.2 520.9 173.9 520.5 173.4C519.5 172.1 518.7 170.9 517.7 169.7C510.5 160.3 502.7 151.4 494.2 143.1C488.5 137.1 482.4 131.6 475.9 126.4C471.9 122.9 467.7 119.7 463.4 116.6C455.7 110.8 447.4 105.8 438.8 101.5C436.4 100.2 434 99 431.6 97.8C413.9 89.2 395.3 82.6 376.2 78.2C374.3 77.8 372.4 77.4 370.6 77L370.5 77C369.5 76.9 368.7 76.6 367.7 76.5C355.2 74.1 342.5 72.8 329.7 72.5L319.1 72.5C303.8 72.7 288.6 74.4 273.6 77.5C240 84.6 210.4 98.7 190.7 116.5C189.6 117.5 188.8 118.2 188.3 118.7L187.8 119.2L187.9 119.2C187.9 119.2 188 119.2 188 119.2C188 119.2 188 119.1 188 119.1L187.9 119.2C188 119.1 188 119.1 188.1 119.1C202.7 110.3 223 103.1 237.5 99.5L243.4 98.1C243.8 98 244.2 98 244.6 97.9C246.3 97.5 248 97.2 249.8 96.8C250 96.8 250.4 96.7 250.6 96.7C314.8 85 383.2 104.2 430.8 149.7C441.1 159.5 450.1 170.5 457.7 182.5C488.1 231.7 485.2 293.6 461.5 330.1C427.1 383.1 350.1 401.4 302.5 354.9C286.5 339.4 277.3 318.2 276.9 295.9C276.7 285.2 278.9 274.7 283.1 264.9C284.8 261.1 296.2 239.2 301.3 240.3C288.2 237.5 263.8 242.9 246.6 268.5C231.2 291.4 232.1 326.7 241.6 351.8C235.6 339.4 231.5 326.2 229.5 312.6C217.3 230 272.8 159.6 323.8 142.1C296.3 118.1 227.3 119.8 176.1 157.5C146.2 179.5 124.9 210.7 113.6 247.9C115.3 227 123.2 195.8 139.4 164C122.2 172.9 100.4 201 89.6 226.9C74 264.3 68.6 309.1 73.5 351.7C73.9 354.9 74.2 358.1 74.6 361.3C94.5 478.4 196.6 567.7 319.4 567.7C456.5 567.7 567.7 456.5 567.7 319.3C567.6 314.8 567.5 310.2 567.2 305.8z"/></svg>`, 58 + chrome: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640" width="1em" height="1em" fill="currentColor"><!--!Font Awesome Free v7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc.--><path d="M64 320C64 273.4 76.5 229.6 98.3 191.1L208.1 382.3C230 421.5 271.9 448 320 448C334.3 448 347.1 445.7 360.8 441.4L284.5 573.6C159.9 556.3 64 449.3 64 320zM429.1 385.6C441.4 366.4 448 343.1 448 320C448 281.8 431.2 247.5 404.7 224L557.4 224C569.4 253.6 576 286.1 576 320C576 461.4 461.4 575.1 320 576L429.1 385.6zM541.8 192L320 192C257.1 192 206.3 236.1 194.5 294.7L118.2 162.5C165 102.5 238 64 320 64C414.8 64 497.5 115.5 541.8 192zM408 320C408 368.6 368.6 408 320 408C271.4 408 232 368.6 232 320C232 271.4 271.4 232 320 232C368.6 232 408 271.4 408 320z"/></svg>`, 59 + safari: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640" width="1em" height="1em" fill="currentColor"><!--!Font Awesome Free v7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc.--><path d="M338.7 338.7L301.3 301.3L230 410L338.7 338.7zM320 72C183 72 72 183 72 320C72 457 183 568 320 568C457 568 568 457 568 320C568 183 457 72 320 72zM475.8 246.8L490.6 240.7C491.6 240.3 492.6 240.1 493.7 240.1C494.8 240.1 495.8 240.3 496.8 240.7C497.8 241.1 498.6 241.7 499.4 242.4C500.2 243.1 500.7 244 501.1 245C501.5 246 501.7 247 501.7 248.1C501.7 249.2 501.5 250.2 501.1 251.2C500.7 252.2 500.1 253.1 499.4 253.8C498.7 254.5 497.8 255.1 496.8 255.5L482 261.6C480 262.4 477.8 262.4 475.9 261.6C474 260.8 472.4 259.2 471.6 257.3C470.8 255.4 470.8 253.1 471.6 251.2C472.4 249.3 474 247.7 475.9 246.9zM378.4 158L384.5 143.2C385.3 141.2 386.9 139.7 388.8 138.9C390.7 138.1 393 138.1 394.9 138.9C396.8 139.7 398.4 141.3 399.2 143.2C400 145.1 400 147.4 399.2 149.3L393.1 164.1C392.3 166.1 390.7 167.6 388.8 168.4C386.9 169.2 384.6 169.2 382.7 168.4C381.7 168 380.8 167.4 380.1 166.7C379.4 166 378.8 165.1 378.4 164.1C378 163.1 377.8 162.1 377.8 161C377.8 159.9 378 158.9 378.4 157.9zM320 124C322.1 124 324.2 124.8 325.7 126.3C327.2 127.8 328 129.9 328 132L328 148C328 150.1 327.2 152.2 325.7 153.7C324.2 155.2 322.2 156 320 156C317.8 156 315.8 155.2 314.3 153.7C312.8 152.2 312 150.2 312 148L312 132C312 129.9 312.8 127.8 314.3 126.3C315.8 124.8 317.9 124 320 124zM245 138.9C246 138.5 247 138.3 248.1 138.3C249.2 138.3 250.2 138.5 251.2 138.9C252.2 139.3 253.1 139.9 253.8 140.6C254.5 141.3 255.1 142.2 255.5 143.2L261.6 158C262 159 262.3 160 262.3 161.1C262.3 162.2 262.1 163.2 261.7 164.2C261.3 165.2 260.7 166.1 260 166.8C259.3 167.5 258.4 168.2 257.4 168.6C256.4 169 255.4 169.2 254.3 169.2C253.2 169.2 252.2 169 251.2 168.6C250.2 168.2 249.3 167.6 248.6 166.8C247.9 166 247.3 165.1 246.9 164.1L240.8 149.3C240 147.3 240 145.1 240.8 143.2C241.6 141.3 243.2 139.7 245.1 138.9zM181.4 181.4C182.9 179.9 184.9 179.1 187.1 179.1C189.3 179.1 191.3 179.9 192.8 181.4L204 192.7C205.5 194.2 206.3 196.2 206.3 198.3C206.3 200.4 205.5 202.4 204 203.9C202.5 205.4 200.5 206.2 198.3 206.2C196.1 206.2 194.1 205.4 192.6 203.9L181.3 192.6C179.8 191.1 179 189.1 179 187C179 184.9 179.8 182.9 181.3 181.4L181.3 181.4zM124 320C124 317.9 124.8 315.8 126.3 314.3C127.8 312.8 129.9 312 132 312L148 312C150.1 312 152.2 312.8 153.7 314.3C155.2 315.8 156 317.8 156 320C156 322.2 155.2 324.2 153.7 325.7C152.2 327.2 150.2 328 148 328L132 328C129.9 328 127.8 327.2 126.3 325.7C124.8 324.2 124 322.1 124 320zM164.2 393.2L149.4 399.3C148.4 399.7 147.4 399.9 146.3 399.9C145.2 399.9 144.2 399.7 143.2 399.3C142.2 398.9 141.3 398.3 140.6 397.6C139.9 396.9 139.3 396 138.9 395C138.5 394 138.3 393 138.3 391.9C138.3 390.8 138.5 389.8 138.9 388.8C139.3 387.8 139.9 386.9 140.6 386.2C141.3 385.5 142.2 384.9 143.2 384.5L158 378.4C160 377.6 162.2 377.6 164.1 378.4C166 379.2 167.6 380.8 168.4 382.7C169.2 384.6 169.2 386.9 168.4 388.8C167.6 390.7 166 392.3 164.1 393.1zM168.5 257.2C168.1 258.2 167.5 259.1 166.8 259.8C166.1 260.5 165.2 261.1 164.2 261.5C163.2 261.9 162.2 262.1 161.1 262.1C160 262.1 159 261.9 158 261.5L143.2 255.4C141.2 254.6 139.7 253 138.9 251.1C138.1 249.2 138.1 246.9 138.9 245C139.7 243.1 141.3 241.5 143.2 240.7C145.1 239.9 147.4 239.9 149.3 240.7L164.1 246.8C166.1 247.6 167.6 249.2 168.4 251.1C169.2 253 169.2 255.3 168.4 257.2L168.4 257.2zM261.6 482L255.5 496.8C255.1 497.8 254.5 498.7 253.8 499.4C253.1 500.1 252.2 500.7 251.2 501.1C250.2 501.5 249.2 501.7 248.1 501.7C247 501.7 246 501.5 245 501.1C244 500.7 243.1 500.1 242.4 499.4C241.7 498.7 241.1 497.8 240.7 496.8C240.3 495.8 240.1 494.8 240.1 493.7C240.1 492.6 240.3 491.6 240.7 490.6L246.8 475.8C247.2 474.8 247.8 473.9 248.5 473.1C249.2 472.3 250.1 471.7 251.1 471.3C252.1 470.9 253.1 470.7 254.2 470.7C255.3 470.7 256.3 470.9 257.3 471.3C258.3 471.7 259.2 472.3 259.9 473.1C260.6 473.9 261.2 474.8 261.6 475.7C262 476.6 262.2 477.7 262.2 478.8C262.2 479.9 262 480.9 261.5 481.9zM328 508C328 510.1 327.2 512.2 325.7 513.7C324.2 515.2 322.2 516 320 516C317.8 516 315.8 515.2 314.3 513.7C312.8 512.2 312 510.2 312 508L312 492C312 489.9 312.8 487.8 314.3 486.3C315.8 484.8 317.8 484 320 484C322.2 484 324.2 484.8 325.7 486.3C327.2 487.8 328 489.8 328 492L328 508zM395 501.1C394 501.5 393 501.7 391.9 501.7C390.8 501.7 389.8 501.5 388.8 501.1C387.8 500.7 386.9 500.1 386.2 499.4C385.5 498.7 384.9 497.8 384.5 496.8L378.4 482C377.6 480 377.6 477.8 378.4 475.9C379.2 474 380.8 472.4 382.7 471.6C384.6 470.8 386.9 470.8 388.8 471.6C390.7 472.4 392.3 474 393.1 475.9L399.2 490.7C400 492.7 400 494.9 399.2 496.8C398.4 498.7 396.8 500.3 394.9 501.1zM458.6 458.6C457.1 460.1 455.1 460.9 452.9 460.9C450.7 460.9 448.7 460.1 447.2 458.6L436 447.3C434.5 445.8 433.7 443.8 433.7 441.7C433.7 439.6 434.5 437.6 436 436.1C437.5 434.6 439.5 433.8 441.7 433.8C443.9 433.8 445.9 434.6 447.4 436.1L458.7 447.4C460.2 448.9 461 450.9 461 453C461 455.1 460.2 457.1 458.7 458.6L458.7 458.6zM350.2 350.2L174.3 465.7L289.8 289.8L465.7 174.3L350.2 350.2zM501.1 395C500.3 397 498.7 398.5 496.8 399.3C494.9 400.1 492.6 400.1 490.7 399.3L475.9 393.2C473.9 392.4 472.4 390.8 471.6 388.9C470.8 387 470.8 384.7 471.6 382.8C472 381.8 472.6 380.9 473.3 380.2C474 379.5 474.9 378.9 475.9 378.5C476.9 378.1 477.9 377.9 479 377.9C480.1 377.9 481.1 378.1 482.1 378.5L496.9 384.6C498.9 385.4 500.4 387 501.2 388.9C502 390.8 502 393.1 501.2 395zM508 328L492 328C489.9 328 487.8 327.2 486.3 325.7C484.8 324.2 484 322.2 484 320C484 317.8 484.8 315.8 486.3 314.3C487.8 312.8 489.8 312 492 312L508 312C510.1 312 512.2 312.8 513.7 314.3C515.2 315.8 516 317.8 516 320C516 322.2 515.2 324.2 513.7 325.7C512.2 327.2 510.2 328 508 328z"/></svg>`, 60 + edge: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640" width="1em" height="1em" fill="currentColor"><!--!Font Awesome Free v7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc.--><path d="M184.1 101.4C225.1 76.2 271.7 63.2 319 64C487 64 576 187.8 576 283.5C575.9 316.2 563 347.4 540.1 370.7C517.2 393.9 486.1 407.2 453.4 407.7C378.2 407.7 361.9 384.6 361.9 375.7C361.9 371.9 363.1 369.5 366.7 366.3L367.7 365.1L368.1 363.5C378.6 352 384 337.3 384 321.9C384 243.2 301.8 179.2 200 179.2C162.5 178.9 125.5 188.1 92.5 206.1C119.5 148.6 175.2 108.5 183.8 102.3C184.6 101.7 184.1 101.5 184.1 101.5zM199.7 419.5C198.3 449.5 204.3 479.5 216.1 506.7C229.7 533.1 248.8 557.7 272.6 576C213.1 564.5 161.1 532.1 123.2 486.7C85.1 440.3 64 382.4 64 321.9C64 270.7 126.4 227.5 200 227.5C236.6 226.9 272.4 238.4 301.8 260.2L298.2 261.4C246.7 279 199.7 352.1 199.7 419.5zM533.8 464L533.1 464.1C521.3 482.9 507.2 499.2 490.9 513.6C460.1 541.6 422.8 559.1 382.1 563.5C363.5 563.8 345.3 560.3 328.3 552.1C302.7 541.8 281.2 522.1 266.7 499.1C252.3 475.2 245.6 447.4 247.7 419.5C247.1 399.4 253.1 379.2 262.7 361.3C276.6 394.4 300.2 422.6 330.3 442.1C360.4 461.6 395.8 471.6 431.7 470.7C462.7 471 493.8 464 521.9 450.2L523.8 449.3C527.7 447 531.5 445.4 535.4 449.3C539.9 454.2 537.2 458.5 534.2 463.3C534 463.5 533.9 463.8 533.8 464z"/></svg>`, 61 + orion: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 135 135" width="1.2em" height="1.2em" fill="currentColor" aria-hidden="true"><path fill-rule="evenodd" d="m67.5 114.4c-26 0-46.9-20.9-46.9-46.9 0-26 20.9-46.9 46.9-46.9 26 0 46.9 20.9 46.9 46.9 0 26-20.9 46.9-46.9 46.9zm1.4-68.3c-0.3-2.1-2.5-2.1-2.8 0-0.9 5.3-2 10.9-5.5 14.5-3.6 3.5-9.2 4.6-14.6 5.5-2 0.3-2.1 2.5 0 2.8 5.4 0.9 11 2 14.5 5.6 3.6 3.5 4.7 9.1 5.6 14.5 0.3 2.1 2.5 2.1 2.8 0 0.9-5.4 2-11 5.5-14.6 3.6-3.5 9.2-4.6 14.6-5.5 2.1-0.3 2.1-2.5 0-2.8-5.4-0.9-11-2-14.5-5.6-3.6-3.5-4.7-9.1-5.6-14.4z"/></svg>`, 52 62 }; 53 63 54 64 export const UserIcon = memo((props: UserIconProps) => {
+72 -77
src/pages/onboarding/OnboardingExtension.tsx
··· 122 122 loading: boolean; 123 123 } 124 124 125 - function ChromeExtensionPage(props: ExtensionPageProps) { 125 + function DefaultExtensionPage(props: ExtensionPageProps) { 126 126 const { t } = useTranslation(); 127 - const installLink = conf().ONBOARDING_CHROME_EXTENSION_INSTALL_LINK; 127 + const installChromeLink = conf().ONBOARDING_CHROME_EXTENSION_INSTALL_LINK; 128 + const installFirefoxLink = conf().ONBOARDING_FIREFOX_EXTENSION_INSTALL_LINK; 129 + 130 + const browser = useMemo(() => { 131 + return detectExtensionInstall(); 132 + }, []); 133 + 128 134 return ( 129 135 <> 130 136 <Heading2 className="!mt-0 !text-3xl max-w-[435px]"> ··· 133 139 <Paragraph className="max-w-[320px] mb-4"> 134 140 {t("onboarding.extension.explainer")} 135 141 </Paragraph> 136 - {installLink ? ( 137 - <Link href={installLink} target="_blank" className="mb-12"> 138 - {t("onboarding.extension.linkChrome")} 139 - </Link> 140 - ) : null} 141 142 142 - <ExtensionStatus status={props.status} loading={props.loading} /> 143 - <Link 144 - href="https://github.com/p-stream/extension" 145 - target="_blank" 146 - className="pt-4 !text-type-dimmed" 147 - > 148 - See extension source code 149 - </Link> 150 - </> 151 - ); 152 - } 143 + {/* Main extension icons */} 144 + <div className="mb-4 flex flex-col md:flex-row md:space-x-8 space-y-4 md:space-y-0 justify-center items-center"> 145 + {installChromeLink && 146 + (browser === "chrome" || browser === "unknown") ? ( 147 + <Link 148 + href={installChromeLink} 149 + target="_blank" 150 + className="flex flex-col items-center space-y-2 p-4 rounded-lg hover:bg-type-surface-hover transition-colors" 151 + > 152 + <span> 153 + <svg 154 + xmlns="http://www.w3.org/2000/svg" 155 + viewBox="0 0 640 640" 156 + width="100px" 157 + height="100px" 158 + fill="currentColor" 159 + > 160 + <path d="M64 320C64 273.4 76.5 229.6 98.3 191.1L208.1 382.3C230 421.5 271.9 448 320 448C334.3 448 347.1 445.7 360.8 441.4L284.5 573.6C159.9 556.3 64 449.3 64 320zM429.1 385.6C441.4 366.4 448 343.1 448 320C448 281.8 431.2 247.5 404.7 224L557.4 224C569.4 253.6 576 286.1 576 320C576 461.4 461.4 575.1 320 576L429.1 385.6zM541.8 192L320 192C257.1 192 206.3 236.1 194.5 294.7L118.2 162.5C165 102.5 238 64 320 64C414.8 64 497.5 115.5 541.8 192zM408 320C408 368.6 368.6 408 320 408C271.4 408 232 368.6 232 320C232 271.4 271.4 232 320 232C368.6 232 408 271.4 408 320z" /> 161 + </svg> 162 + </span> 163 + <span className="font-medium text-center"> 164 + {t("onboarding.extension.linkChrome")} 165 + </span> 166 + </Link> 167 + ) : null} 168 + {installFirefoxLink && 169 + (browser === "firefox" || browser === "unknown") ? ( 170 + <Link 171 + href={installFirefoxLink} 172 + target="_blank" 173 + className="flex flex-col items-center space-y-2 p-4 rounded-lg hover:bg-type-surface-hover transition-colors" 174 + > 175 + <span> 176 + <svg 177 + xmlns="http://www.w3.org/2000/svg" 178 + viewBox="0 0 640 640" 179 + width="100px" 180 + height="100px" 181 + fill="currentColor" 182 + > 183 + <path d="M567.5 305.5C567.4 303.9 567.3 302.4 567.3 300.8L567.3 300.7L566.9 296L566.9 295.9C565.6 282 563.2 268.2 559.6 254.7C559.6 254.6 559.6 254.6 559.5 254.5L558.4 250.5C558.3 250.3 558.3 250 558.2 249.9C557.8 248.7 557.5 247.4 557.1 246.2C557 246 557 245.6 556.9 245.4C556.5 244.2 556.2 243 555.8 241.9C555.7 241.5 555.6 241.3 555.4 240.9C555 239.7 554.7 238.6 554.2 237.4L553.8 236.3C553.4 235.2 553 234 552.6 232.9C552.5 232.6 552.4 232.2 552.2 231.9C551.7 230.8 551.4 229.6 550.9 228.5C550.8 228.3 550.7 227.9 550.5 227.7C550 226.5 549.5 225.4 549.1 224.2C549.1 224.1 549 224 549 223.8C547.4 220 545.8 216.1 544 212.4L543.6 211.7C543.1 210.7 542.8 209.9 542.3 209.1C542.1 208.6 541.8 208 541.6 207.5C541.2 206.7 540.8 205.9 540.4 205.1C540 204.5 539.8 203.9 539.4 203.3C539 202.7 538.6 201.9 538.2 201C537.8 200.4 537.5 199.7 537.1 199.1C536.7 198.5 536.3 197.7 535.9 196.9C535.5 196.2 535.1 195.5 534.7 194.9C534.3 194.2 533.9 193.6 533.5 192.9C533.1 192.2 532.7 191.6 532.3 190.9C531.9 190.2 531.5 189.6 531.1 189C530.7 188.4 530.3 187.6 529.8 186.8C529.4 186.2 529 185.6 528.6 185L527.2 182.9C526.8 182.3 526.4 181.7 526 181.1C525.5 180.4 524.9 179.5 524.4 178.8C524 178.3 523.7 177.7 523.3 177.2L521.5 174.7C521.1 174.2 520.9 173.9 520.5 173.4C519.5 172.1 518.7 170.9 517.7 169.7C510.5 160.3 502.7 151.4 494.2 143.1C488.5 137.1 482.4 131.6 475.9 126.4C471.9 122.9 467.7 119.7 463.4 116.6C455.7 110.8 447.4 105.8 438.8 101.5C436.4 100.2 434 99 431.6 97.8C413.9 89.2 395.3 82.6 376.2 78.2C374.3 77.8 372.4 77.4 370.6 77L370.5 77C369.5 76.9 368.7 76.6 367.7 76.5C355.2 74.1 342.5 72.8 329.7 72.5L319.1 72.5C303.8 72.7 288.6 74.4 273.6 77.5C240 84.6 210.4 98.7 190.7 116.5C189.6 117.5 188.8 118.2 188.3 118.7L187.8 119.2L187.9 119.2C187.9 119.2 188 119.2 188 119.2C188 119.2 188 119.1 188 119.1L187.9 119.2C188 119.1 188 119.1 188.1 119.1C202.7 110.3 223 103.1 237.5 99.5L243.4 98.1C243.8 98 244.2 98 244.6 97.9C246.3 97.5 248 97.2 249.8 96.8C250 96.8 250.4 96.7 250.6 96.7C314.8 85 383.2 104.2 430.8 149.7C441.1 159.5 450.1 170.5 457.7 182.5C488.1 231.7 485.2 293.6 461.5 330.1C427.1 383.1 350.1 401.4 302.5 354.9C286.5 339.4 277.3 318.2 276.9 295.9C276.7 285.2 278.9 274.7 283.1 264.9C284.8 261.1 296.2 239.2 301.3 240.3C288.2 237.5 263.8 242.9 246.6 268.5C231.2 291.4 232.1 326.7 241.6 351.8C235.6 339.4 231.5 326.2 229.5 312.6C217.3 230 272.8 159.6 323.8 142.1C296.3 118.1 227.3 119.8 176.1 157.5C146.2 179.5 124.9 210.7 113.6 247.9C115.3 227 123.2 195.8 139.4 164C122.2 172.9 100.4 201 89.6 226.9C74 264.3 68.6 309.1 73.5 351.7C73.9 354.9 74.2 358.1 74.6 361.3C94.5 478.4 196.6 567.7 319.4 567.7C456.5 567.7 567.7 456.5 567.7 319.3C567.6 314.8 567.5 310.2 567.2 305.8z" /> 184 + </svg> 185 + </span> 186 + <span className="font-medium text-center"> 187 + {t("onboarding.extension.linkFirefox")} 188 + </span> 189 + </Link> 190 + ) : null} 191 + </div> 153 192 154 - function FirefoxExtensionPage(props: ExtensionPageProps) { 155 - const { t } = useTranslation(); 156 - const installLink = conf().ONBOARDING_FIREFOX_EXTENSION_INSTALL_LINK; 157 - return ( 158 - <> 159 - <Heading2 className="!mt-0 !text-3xl max-w-[435px]"> 160 - {t("onboarding.extension.title")} 161 - </Heading2> 162 - <Paragraph className="max-w-[320px] mb-4"> 163 - {t("onboarding.extension.explainer")} 164 - </Paragraph> 165 - {installLink ? ( 166 - <Link href={installLink} target="_blank" className="mb-12"> 167 - {t("onboarding.extension.linkFirefox")} 168 - </Link> 169 - ) : null} 193 + {/* Secondary userscript option */} 194 + <div className="mb-6 text-left"> 195 + <div className="flex flex-col items-center space-y-1"> 196 + <Link href="/p-stream.user.js" target="_blank" className="text-sm"> 197 + {t("onboarding.extension.linkUserscript")} 198 + </Link> 199 + <span className="text-type-dimmed text-xs"> 200 + {t("onboarding.extension.userscriptNote")} 201 + </span> 202 + </div> 203 + </div> 170 204 171 205 <ExtensionStatus status={props.status} loading={props.loading} showHelp /> 172 206 <Link ··· 197 231 ); 198 232 } 199 233 200 - function UnknownExtensionPage(props: ExtensionPageProps) { 201 - const { t } = useTranslation(); 202 - const installChromeLink = conf().ONBOARDING_CHROME_EXTENSION_INSTALL_LINK; 203 - const installFirefoxLink = conf().ONBOARDING_FIREFOX_EXTENSION_INSTALL_LINK; 204 - return ( 205 - <> 206 - <Heading2 className="!mt-0 !text-3xl max-w-[435px]"> 207 - {t("onboarding.extension.title")} 208 - </Heading2> 209 - <Paragraph className="max-w-[320px] mb-4"> 210 - {t("onboarding.extension.explainer")} 211 - </Paragraph> 212 - <div className="mb-4"> 213 - {installChromeLink ? ( 214 - <Link href={installChromeLink} target="_blank"> 215 - {t("onboarding.extension.linkChrome")} 216 - </Link> 217 - ) : null} 218 - </div> 219 - <div className="mb-12"> 220 - {installFirefoxLink ? ( 221 - <Link href={installFirefoxLink} target="_blank"> 222 - {t("onboarding.extension.linkFirefox")} 223 - </Link> 224 - ) : null} 225 - </div> 226 - 227 - <ExtensionStatus status={props.status} loading={props.loading} showHelp /> 228 - <Link 229 - href="https://github.com/p-stream/extension" 230 - target="_blank" 231 - className="pt-4 !text-type-dimmed" 232 - > 233 - See extension source code 234 - </Link> 235 - </> 236 - ); 237 - } 238 - 239 234 export function OnboardingExtensionPage() { 240 235 const { t } = useTranslation(); 241 236 const navigate = useNavigateOnboarding(); ··· 254 249 255 250 const componentMap: Record< 256 251 ExtensionDetectionResult, 257 - typeof UnknownExtensionPage 252 + typeof DefaultExtensionPage 258 253 > = { 259 - chrome: ChromeExtensionPage, 260 - firefox: FirefoxExtensionPage, 254 + chrome: DefaultExtensionPage, 255 + firefox: DefaultExtensionPage, 261 256 ios: IosExtensionPage, 262 - unknown: UnknownExtensionPage, 257 + unknown: DefaultExtensionPage, 263 258 }; 264 259 const PageContent = componentMap[extensionSupport]; 265 260