diff --git a/svelte/src/file_viewer/AdLeaderboard.svelte b/svelte/src/file_viewer/AdLeaderboard.svelte index ab104d7..534fa2b 100644 --- a/svelte/src/file_viewer/AdLeaderboard.svelte +++ b/svelte/src/file_viewer/AdLeaderboard.svelte @@ -6,6 +6,14 @@ let banner let ad_type = "" onMount(() => { + if (window.location.pathname === "/u/demo") { + let url_ads = new URL(window.location.href).searchParams.get("ads") + if (url_ads !== "") { + ad_type = url_ads + return + } + } + switch (Math.floor(Math.random() * 20)) { case 0: ad_type = "publisherrest_1" @@ -124,6 +132,13 @@ const ads_plus = () => { shopping_cart + {:else if ad_type === "a-ads"} + + {:else if ad_type === "brave"} diff --git a/svelte/src/file_viewer/AdSkyscraper.svelte b/svelte/src/file_viewer/AdSkyscraper.svelte index 58bf262..8d35211 100644 --- a/svelte/src/file_viewer/AdSkyscraper.svelte +++ b/svelte/src/file_viewer/AdSkyscraper.svelte @@ -7,6 +7,15 @@ let ad_type = "" let visible = false onMount(async () => { + if (window.location.pathname === "/u/demo") { + let url_ads = new URL(window.location.href).searchParams.get("ads") + if (url_ads !== "") { + ad_type = url_ads + open() + return + } + } + if (document.body.clientWidth < 800) { visible = false dispatch("visibility", false) @@ -36,12 +45,15 @@ onMount(async () => { break } + open() +}) + +const open = async () => { visible = true await tick() dispatch("visibility", true) container.style.right = "0" -}) - +} const close = () => { container.style.right = -container.offsetWidth + "px" dispatch("visibility", false) diff --git a/svelte/src/file_viewer/FileStats.svelte b/svelte/src/file_viewer/FileStats.svelte index 9668b78..76fc493 100644 --- a/svelte/src/file_viewer/FileStats.svelte +++ b/svelte/src/file_viewer/FileStats.svelte @@ -17,7 +17,7 @@ let error_msg = "" $: update_stats(file.id) let update_stats = (id) => { - if (id === "") { + if (id === "" || id == "demo") { return } diff --git a/svelte/src/file_viewer/FileViewer.svelte b/svelte/src/file_viewer/FileViewer.svelte index 7cec361..a9ab08f 100644 --- a/svelte/src/file_viewer/FileViewer.svelte +++ b/svelte/src/file_viewer/FileViewer.svelte @@ -6,13 +6,14 @@ import DetailsWindow from "./DetailsWindow.svelte"; import FilePreview from "./FilePreview.svelte"; import ListNavigator from "./ListNavigator.svelte"; import FileStats from "./FileStats.svelte"; -import { copy_text, domain_url } from "../util/Util.svelte"; +import { copy_text } from "../util/Util.svelte"; import EditWindow from "./EditWindow.svelte"; import EmbedWindow from "./EmbedWindow.svelte"; import ReportWindow from "./ReportWindow.svelte"; import IntroPopup from "./IntroPopup.svelte"; import AdLeaderboard from "./AdLeaderboard.svelte"; import AdSkyscraper from "./AdSkyscraper.svelte"; +import Sharebar from "./Sharebar.svelte"; let is_list = false let embedded = false @@ -47,12 +48,21 @@ let toggle_shuffle = () => { list_navigator.set_shuffle(list_shuffle) } +let sharebar let sharebar_visible = false +let toggle_sharebar = () => { + sharebar_visible = !sharebar_visible + if (sharebar_visible) { + sharebar.show() + } else { + sharebar.hide() + } +} let toolbar_visible = (window.innerWidth > 600) let toolbar_toggle = () => { toolbar_visible = !toolbar_visible - if (!toolbar_visible) { - sharebar_visible = false + if (!toolbar_visible && sharebar_visible) { + toggle_sharebar() } } let details_window @@ -346,7 +356,7 @@ const keyboard_event = evt => { {/if} - sharebar_visible = !sharebar_visible} class="toolbar_button button_full_width" class:button_highlight={sharebar_visible}> + share Share @@ -397,24 +407,7 @@ const keyboard_event = evt => { - - Share on: - - E-Mail - - - Reddit - - - Twitter - - - Facebook - - - Tumblr - - + { - {report_visible = e.detail}} title="Report abuse" width="650px"> + {report_visible = e.detail}} title="Report abuse" width="800px"> @@ -594,24 +587,6 @@ const keyboard_event = evt => { .file_preview.toolbar_visible { left: 8em; } .file_preview.skyscraper_visible { right: 160px; } -.sharebar { - position: absolute; - width: 7em; - left: -8em; - bottom: 0; - top: 0; - overflow-y: scroll; - overflow-x: hidden; - box-shadow: inset 1px 1px 5px var(--shadow_color); - background-color: var(--layer_1_color); - border-radius: 16px; - text-align: center; - z-index: 48; - overflow: hidden; - transition: left 0.5s; -} -.sharebar.sharebar_visible { left: 8em; } - /* Workaround to hide the scrollbar in non webkit browsers, it's really ugly' */ .toolbar > div { position: absolute; @@ -638,17 +613,6 @@ const keyboard_event = evt => { vertical-align: middle; } -/* ========================= - || SHAREBAR COMPONENTS || - ========================= */ - -.sharebar-button {text-align: center;} -.sharebar-button > svg, -.sharebar-button > img { - width: 40px; - height: 40px; -} - /* ===================== || MISC COMPONENTS || ===================== */ diff --git a/svelte/src/file_viewer/Sharebar.svelte b/svelte/src/file_viewer/Sharebar.svelte new file mode 100644 index 0000000..496b9c9 --- /dev/null +++ b/svelte/src/file_viewer/Sharebar.svelte @@ -0,0 +1,87 @@ + + + + Share on: + + + + + + E-Mail + + + + + + + Reddit + + + + + + + Twitter + + + + + + + Facebook + + + + + + + Tumblr + + + + diff --git a/svelte/src/file_viewer/viewers/Text.svelte b/svelte/src/file_viewer/viewers/Text.svelte index 9347e89..fe06b0b 100644 --- a/svelte/src/file_viewer/viewers/Text.svelte +++ b/svelte/src/file_viewer/viewers/Text.svelte @@ -122,5 +122,6 @@ const code = () => { .container > pre { white-space: pre-wrap; overflow: hidden; + border: none; } diff --git a/svelte/src/user_home/Home.svelte b/svelte/src/user_home/Home.svelte index ac3285d..41c1a2c 100644 --- a/svelte/src/user_home/Home.svelte +++ b/svelte/src/user_home/Home.svelte @@ -258,19 +258,3 @@ onDestroy(() => { - - diff --git a/webcontroller/file_preview.go b/webcontroller/file_preview.go index 571c3a2..c9d722b 100644 --- a/webcontroller/file_preview.go +++ b/webcontroller/file_preview.go @@ -60,7 +60,7 @@ func (wc *WebController) serveFilePreview(w http.ResponseWriter, r *http.Request // categorize the website. func serveFilePreviewDemo(w http.ResponseWriter) { io.WriteString(w, - ` + ` , __ _ /|/ \o | | | o |___/ _ | | __| ,_ __, _ _ diff --git a/webcontroller/file_viewer_svelte.go b/webcontroller/file_viewer_svelte.go index a2e765e..1723fe0 100644 --- a/webcontroller/file_viewer_svelte.go +++ b/webcontroller/file_viewer_svelte.go @@ -12,20 +12,21 @@ import ( ) type fileViewerData struct { - Type string `json:"type"` // file or list - APIResponse interface{} `json:"api_response"` - CaptchaKey string `json:"captcha_key"` - ViewToken string `json:"view_token"` - AdBannerType string `json:"ad_banner_type"` - AdSkyscraperType string `json:"ad_skyscraper_type"` - AdFloaterType string `json:"ad_floater_type"` - Embedded bool `json:"embedded"` - FileAdsEnabled bool `json:"file_ads_enabled"` - UserAdsEnabled bool `json:"user_ads_enabled"` + Type string `json:"type"` // file or list + APIResponse interface{} `json:"api_response"` + CaptchaKey string `json:"captcha_key"` + ViewToken string `json:"view_token"` + Embedded bool `json:"embedded"` + UserAdsEnabled bool `json:"user_ads_enabled"` } // ServeFileViewer controller for GET /u/:id func (wc *WebController) serveSvelteFile(w http.ResponseWriter, r *http.Request, p httprouter.Params) { + if p.ByName("id") == "demo" { + wc.serveSvelteViewerDemo(w, r) // Required for a-ads.com quality check + return + } + // If the user agent is Wget we redirect it to the API so that the file can // be downloaded directly if strings.HasPrefix(r.UserAgent(), "Wget/") { @@ -61,7 +62,6 @@ func (wc *WebController) serveSvelteFile(w http.ResponseWriter, r *http.Request, var vd = fileViewerData{ CaptchaKey: wc.captchaKey(), ViewToken: wc.viewTokenOrBust(), - FileAdsEnabled: files[0].ShowAds, UserAdsEnabled: !(templateData.Authenticated && templateData.User.Subscription.DisableAdDisplay), } @@ -132,7 +132,6 @@ func (wc *WebController) serveSvelteList(w http.ResponseWriter, r *http.Request, Type: "list", CaptchaKey: wc.captchaSiteKey, ViewToken: wc.viewTokenOrBust(), - FileAdsEnabled: list.Files[0].ShowAds, UserAdsEnabled: !(templateData.Authenticated && templateData.User.Subscription.DisableAdDisplay), APIResponse: list, } @@ -154,3 +153,34 @@ func (wc *WebController) serveSvelteList(w http.ResponseWriter, r *http.Request, log.Error("Error executing template file_viewer: %s", err) } } + +// ServeFileViewerDemo is a dummy API response that responds with info about a +// non-existent demo file. This is required by the a-ads ad network to allow for +// automatic checking of the presence of the ad unit on this page. +func (wc *WebController) serveSvelteViewerDemo(w http.ResponseWriter, r *http.Request) { + templateData := wc.newTemplateData(w, r) + templateData.Other = fileViewerData{ + Type: "file", + CaptchaKey: wc.captchaSiteKey, + UserAdsEnabled: true, + APIResponse: map[string]interface{}{ + "id": "demo", + "name": "Demo file", + "date_upload": "2017-01-01 12:34:56", + "date_lastview": "2017-01-01 12:34:56", + "size": 123456789, + "views": 1, + "bandwidth_used": 123456789, + "mime_type": "text/demo", + "description": "A file to demonstrate the viewer page", + "mime_image": "/res/img/mime/text.png", + "thumbnail": "/res/img/mime/text.png", + "abuse_type": "", + "show_ads": true, + }, + } + err := wc.templates.Get().ExecuteTemplate(w, "file_viewer_svelte", templateData) + if err != nil && !strings.Contains(err.Error(), "broken pipe") { + log.Error("Error rendering demo file: %s", err) + } +} diff --git a/webcontroller/web_controller.go b/webcontroller/web_controller.go index 9bc601f..7eaaa29 100644 --- a/webcontroller/web_controller.go +++ b/webcontroller/web_controller.go @@ -133,11 +133,11 @@ func New( {GET, "" /* */, wc.serveTemplate("home", handlerOpts{})}, {GET, "api" /* */, wc.serveMarkdown("api.md", handlerOpts{})}, {GET, "history" /* */, wc.serveTemplate("history_cookies", handlerOpts{})}, - {GET, "u/:id" /* */, wc.serveFileViewer}, {GET, "u/:id/preview" /* */, wc.serveFilePreview}, - {GET, "u2/:id" /* */, wc.serveSvelteFile}, - {GET, "l2/:id" /* */, wc.serveSvelteList}, - {GET, "l/:id" /* */, wc.serveListViewer}, + {GET, "u/:id" /* */, wc.serveSvelteFile}, + {GET, "l/:id" /* */, wc.serveSvelteList}, + {GET, "u_old/:id" /* */, wc.serveFileViewer}, + {GET, "l_old/:id" /* */, wc.serveListViewer}, {GET, "d/*path" /* */, wc.serveDirectory}, {GET, "t" /* */, wc.serveTemplate("text_editor", handlerOpts{})}, {GET, "donation" /* */, wc.serveMarkdown("donation.md", handlerOpts{})},
+ ` , __ _ /|/ \o | | | o |___/ _ | | __| ,_ __, _ _ diff --git a/webcontroller/file_viewer_svelte.go b/webcontroller/file_viewer_svelte.go index a2e765e..1723fe0 100644 --- a/webcontroller/file_viewer_svelte.go +++ b/webcontroller/file_viewer_svelte.go @@ -12,20 +12,21 @@ import ( ) type fileViewerData struct { - Type string `json:"type"` // file or list - APIResponse interface{} `json:"api_response"` - CaptchaKey string `json:"captcha_key"` - ViewToken string `json:"view_token"` - AdBannerType string `json:"ad_banner_type"` - AdSkyscraperType string `json:"ad_skyscraper_type"` - AdFloaterType string `json:"ad_floater_type"` - Embedded bool `json:"embedded"` - FileAdsEnabled bool `json:"file_ads_enabled"` - UserAdsEnabled bool `json:"user_ads_enabled"` + Type string `json:"type"` // file or list + APIResponse interface{} `json:"api_response"` + CaptchaKey string `json:"captcha_key"` + ViewToken string `json:"view_token"` + Embedded bool `json:"embedded"` + UserAdsEnabled bool `json:"user_ads_enabled"` } // ServeFileViewer controller for GET /u/:id func (wc *WebController) serveSvelteFile(w http.ResponseWriter, r *http.Request, p httprouter.Params) { + if p.ByName("id") == "demo" { + wc.serveSvelteViewerDemo(w, r) // Required for a-ads.com quality check + return + } + // If the user agent is Wget we redirect it to the API so that the file can // be downloaded directly if strings.HasPrefix(r.UserAgent(), "Wget/") { @@ -61,7 +62,6 @@ func (wc *WebController) serveSvelteFile(w http.ResponseWriter, r *http.Request, var vd = fileViewerData{ CaptchaKey: wc.captchaKey(), ViewToken: wc.viewTokenOrBust(), - FileAdsEnabled: files[0].ShowAds, UserAdsEnabled: !(templateData.Authenticated && templateData.User.Subscription.DisableAdDisplay), } @@ -132,7 +132,6 @@ func (wc *WebController) serveSvelteList(w http.ResponseWriter, r *http.Request, Type: "list", CaptchaKey: wc.captchaSiteKey, ViewToken: wc.viewTokenOrBust(), - FileAdsEnabled: list.Files[0].ShowAds, UserAdsEnabled: !(templateData.Authenticated && templateData.User.Subscription.DisableAdDisplay), APIResponse: list, } @@ -154,3 +153,34 @@ func (wc *WebController) serveSvelteList(w http.ResponseWriter, r *http.Request, log.Error("Error executing template file_viewer: %s", err) } } + +// ServeFileViewerDemo is a dummy API response that responds with info about a +// non-existent demo file. This is required by the a-ads ad network to allow for +// automatic checking of the presence of the ad unit on this page. +func (wc *WebController) serveSvelteViewerDemo(w http.ResponseWriter, r *http.Request) { + templateData := wc.newTemplateData(w, r) + templateData.Other = fileViewerData{ + Type: "file", + CaptchaKey: wc.captchaSiteKey, + UserAdsEnabled: true, + APIResponse: map[string]interface{}{ + "id": "demo", + "name": "Demo file", + "date_upload": "2017-01-01 12:34:56", + "date_lastview": "2017-01-01 12:34:56", + "size": 123456789, + "views": 1, + "bandwidth_used": 123456789, + "mime_type": "text/demo", + "description": "A file to demonstrate the viewer page", + "mime_image": "/res/img/mime/text.png", + "thumbnail": "/res/img/mime/text.png", + "abuse_type": "", + "show_ads": true, + }, + } + err := wc.templates.Get().ExecuteTemplate(w, "file_viewer_svelte", templateData) + if err != nil && !strings.Contains(err.Error(), "broken pipe") { + log.Error("Error rendering demo file: %s", err) + } +} diff --git a/webcontroller/web_controller.go b/webcontroller/web_controller.go index 9bc601f..7eaaa29 100644 --- a/webcontroller/web_controller.go +++ b/webcontroller/web_controller.go @@ -133,11 +133,11 @@ func New( {GET, "" /* */, wc.serveTemplate("home", handlerOpts{})}, {GET, "api" /* */, wc.serveMarkdown("api.md", handlerOpts{})}, {GET, "history" /* */, wc.serveTemplate("history_cookies", handlerOpts{})}, - {GET, "u/:id" /* */, wc.serveFileViewer}, {GET, "u/:id/preview" /* */, wc.serveFilePreview}, - {GET, "u2/:id" /* */, wc.serveSvelteFile}, - {GET, "l2/:id" /* */, wc.serveSvelteList}, - {GET, "l/:id" /* */, wc.serveListViewer}, + {GET, "u/:id" /* */, wc.serveSvelteFile}, + {GET, "l/:id" /* */, wc.serveSvelteList}, + {GET, "u_old/:id" /* */, wc.serveFileViewer}, + {GET, "l_old/:id" /* */, wc.serveListViewer}, {GET, "d/*path" /* */, wc.serveDirectory}, {GET, "t" /* */, wc.serveTemplate("text_editor", handlerOpts{})}, {GET, "donation" /* */, wc.serveMarkdown("donation.md", handlerOpts{})},
, __ _ /|/ \o | | | o |___/ _ | | __| ,_ __, _ _ diff --git a/webcontroller/file_viewer_svelte.go b/webcontroller/file_viewer_svelte.go index a2e765e..1723fe0 100644 --- a/webcontroller/file_viewer_svelte.go +++ b/webcontroller/file_viewer_svelte.go @@ -12,20 +12,21 @@ import ( ) type fileViewerData struct { - Type string `json:"type"` // file or list - APIResponse interface{} `json:"api_response"` - CaptchaKey string `json:"captcha_key"` - ViewToken string `json:"view_token"` - AdBannerType string `json:"ad_banner_type"` - AdSkyscraperType string `json:"ad_skyscraper_type"` - AdFloaterType string `json:"ad_floater_type"` - Embedded bool `json:"embedded"` - FileAdsEnabled bool `json:"file_ads_enabled"` - UserAdsEnabled bool `json:"user_ads_enabled"` + Type string `json:"type"` // file or list + APIResponse interface{} `json:"api_response"` + CaptchaKey string `json:"captcha_key"` + ViewToken string `json:"view_token"` + Embedded bool `json:"embedded"` + UserAdsEnabled bool `json:"user_ads_enabled"` } // ServeFileViewer controller for GET /u/:id func (wc *WebController) serveSvelteFile(w http.ResponseWriter, r *http.Request, p httprouter.Params) { + if p.ByName("id") == "demo" { + wc.serveSvelteViewerDemo(w, r) // Required for a-ads.com quality check + return + } + // If the user agent is Wget we redirect it to the API so that the file can // be downloaded directly if strings.HasPrefix(r.UserAgent(), "Wget/") { @@ -61,7 +62,6 @@ func (wc *WebController) serveSvelteFile(w http.ResponseWriter, r *http.Request, var vd = fileViewerData{ CaptchaKey: wc.captchaKey(), ViewToken: wc.viewTokenOrBust(), - FileAdsEnabled: files[0].ShowAds, UserAdsEnabled: !(templateData.Authenticated && templateData.User.Subscription.DisableAdDisplay), } @@ -132,7 +132,6 @@ func (wc *WebController) serveSvelteList(w http.ResponseWriter, r *http.Request, Type: "list", CaptchaKey: wc.captchaSiteKey, ViewToken: wc.viewTokenOrBust(), - FileAdsEnabled: list.Files[0].ShowAds, UserAdsEnabled: !(templateData.Authenticated && templateData.User.Subscription.DisableAdDisplay), APIResponse: list, } @@ -154,3 +153,34 @@ func (wc *WebController) serveSvelteList(w http.ResponseWriter, r *http.Request, log.Error("Error executing template file_viewer: %s", err) } } + +// ServeFileViewerDemo is a dummy API response that responds with info about a +// non-existent demo file. This is required by the a-ads ad network to allow for +// automatic checking of the presence of the ad unit on this page. +func (wc *WebController) serveSvelteViewerDemo(w http.ResponseWriter, r *http.Request) { + templateData := wc.newTemplateData(w, r) + templateData.Other = fileViewerData{ + Type: "file", + CaptchaKey: wc.captchaSiteKey, + UserAdsEnabled: true, + APIResponse: map[string]interface{}{ + "id": "demo", + "name": "Demo file", + "date_upload": "2017-01-01 12:34:56", + "date_lastview": "2017-01-01 12:34:56", + "size": 123456789, + "views": 1, + "bandwidth_used": 123456789, + "mime_type": "text/demo", + "description": "A file to demonstrate the viewer page", + "mime_image": "/res/img/mime/text.png", + "thumbnail": "/res/img/mime/text.png", + "abuse_type": "", + "show_ads": true, + }, + } + err := wc.templates.Get().ExecuteTemplate(w, "file_viewer_svelte", templateData) + if err != nil && !strings.Contains(err.Error(), "broken pipe") { + log.Error("Error rendering demo file: %s", err) + } +} diff --git a/webcontroller/web_controller.go b/webcontroller/web_controller.go index 9bc601f..7eaaa29 100644 --- a/webcontroller/web_controller.go +++ b/webcontroller/web_controller.go @@ -133,11 +133,11 @@ func New( {GET, "" /* */, wc.serveTemplate("home", handlerOpts{})}, {GET, "api" /* */, wc.serveMarkdown("api.md", handlerOpts{})}, {GET, "history" /* */, wc.serveTemplate("history_cookies", handlerOpts{})}, - {GET, "u/:id" /* */, wc.serveFileViewer}, {GET, "u/:id/preview" /* */, wc.serveFilePreview}, - {GET, "u2/:id" /* */, wc.serveSvelteFile}, - {GET, "l2/:id" /* */, wc.serveSvelteList}, - {GET, "l/:id" /* */, wc.serveListViewer}, + {GET, "u/:id" /* */, wc.serveSvelteFile}, + {GET, "l/:id" /* */, wc.serveSvelteList}, + {GET, "u_old/:id" /* */, wc.serveFileViewer}, + {GET, "l_old/:id" /* */, wc.serveListViewer}, {GET, "d/*path" /* */, wc.serveDirectory}, {GET, "t" /* */, wc.serveTemplate("text_editor", handlerOpts{})}, {GET, "donation" /* */, wc.serveMarkdown("donation.md", handlerOpts{})},