Browse Source

Move styles to sass, add details about giphy_mxc_prefix

pull/75/head
Nischay 2 years ago
parent
commit
0c70fad5c3
  1. 10
      sticker/lib/matrix.py
  2. 32
      web/src/index.js
  3. 2
      web/style/index.css
  4. 12
      web/style/index.sass

10
sticker/lib/matrix.py

@ -55,13 +55,18 @@ async def load_config(path: str) -> None:
config = json.load(config_file) config = json.load(config_file)
homeserver_url = config["homeserver"] homeserver_url = config["homeserver"]
access_token = config["access_token"] access_token = config["access_token"]
try:
giphy_api_key = config["giphy_api_key"] giphy_api_key = config["giphy_api_key"]
giphy_homeserver = config["giphy_homeserver"]
giphy_mxc_prefix = config["giphy_mxc_prefix"]
except KeyError:
# these two are not mandatory, assume GIF search is disabled
print("Giphy related parameters not found in the config file.")
except FileNotFoundError: except FileNotFoundError:
print("Matrix config file not found. Please enter your homeserver and access token. Enter the Giphy API token if required, leave blank to disable the gif picker.") print("Matrix config file not found. Please enter your homeserver and access token. Enter the Giphy API token if required, leave blank to disable the gif picker.")
homeserver_url = input("Homeserver URL: ") homeserver_url = input("Homeserver URL: ")
access_token = input("Access token: ") access_token = input("Access token: ")
giphy_api_key = input("Giphy API key: ") giphy_api_key = input("Giphy API key: ")
giphy_mxc_prefix = input("Giphy MXC prefix. Defaults to 'mxc://giphy.mau.dev/', required to proxy GIFs: ")
whoami_url = URL(homeserver_url) / "_matrix" / "client" / "r0" / "account" / "whoami" whoami_url = URL(homeserver_url) / "_matrix" / "client" / "r0" / "account" / "whoami"
if whoami_url.scheme not in ("https", "http"): if whoami_url.scheme not in ("https", "http"):
whoami_url = whoami_url.with_scheme("https") whoami_url = whoami_url.with_scheme("https")
@ -71,7 +76,8 @@ async def load_config(path: str) -> None:
"homeserver": homeserver_url, "homeserver": homeserver_url,
"user_id": user_id, "user_id": user_id,
"access_token": access_token, "access_token": access_token,
"giphy_api_key": giphy_api_key
"giphy_api_key": giphy_api_key,
"giphy_mxc_prefix": giphy_mxc_prefix,
}, config_file) }, config_file)
print(f"Wrote config to {path}") print(f"Wrote config to {path}")

32
web/src/index.js

@ -32,7 +32,7 @@ if (params.has('config')) {
// This is updated from packs/index.json // This is updated from packs/index.json
let HOMESERVER_URL = "https://matrix-client.matrix.org" let HOMESERVER_URL = "https://matrix-client.matrix.org"
let GIPHY_API_KEY = "" let GIPHY_API_KEY = ""
let GIPHY_HOMESERVER = "mxc://giphy.mau.dev/"
let GIPHY_MXC_PREFIX = "mxc://giphy.mau.dev/"
const makeThumbnailURL = mxc => `${HOMESERVER_URL}/_matrix/media/r0/thumbnail/${mxc.substr(6)}?height=128&width=128&method=scale` const makeThumbnailURL = mxc => `${HOMESERVER_URL}/_matrix/media/r0/thumbnail/${mxc.substr(6)}?height=128&width=128&method=scale`
@ -69,7 +69,7 @@ class GiphySearchTab extends Component {
this.setState({ loading: true }); this.setState({ loading: true });
try { try {
const apiKey = GIPHY_API_KEY; const apiKey = GIPHY_API_KEY;
const gif_homeserver = GIPHY_HOMESERVER;
const mxc_prefix = GIPHY_MXC_PREFIX;
const url = `https://api.giphy.com/v1/gifs/search?q=${this.state.searchTerm}&api_key=${apiKey}`; const url = `https://api.giphy.com/v1/gifs/search?q=${this.state.searchTerm}&api_key=${apiKey}`;
this.setState({ loading: true }); this.setState({ loading: true });
const response = await fetch(url); const response = await fetch(url);
@ -83,16 +83,10 @@ class GiphySearchTab extends Component {
"h": jsonElement.images.original.height, "h": jsonElement.images.original.height,
"w": jsonElement.images.original.width, "w": jsonElement.images.original.width,
"size": jsonElement.images.original.size, "size": jsonElement.images.original.size,
"mimetype": "image/gif",
"thumbnail_info": {
"h": jsonElement.images.fixed_width_still.height,
"mimetype": "image/jpg",
"size": jsonElement.images.fixed_width_still.size,
"w": jsonElement.images.fixed_width_still.width
},
"mimetype": "image/webp",
}, },
"msgtype": "m.image", "msgtype": "m.image",
"url": gif_homeserver+jsonElement.id
"url": mxc_prefix+jsonElement.id
}; };
this.setState((prevState) => ({ this.setState((prevState) => ({
GIFById: {...prevState.GIFById, [id]: updatedItem}})); GIFById: {...prevState.GIFById, [id]: updatedItem}}));
@ -265,7 +259,7 @@ class App extends Component {
const indexData = await indexRes.json() const indexData = await indexRes.json()
HOMESERVER_URL = indexData.homeserver_url || HOMESERVER_URL HOMESERVER_URL = indexData.homeserver_url || HOMESERVER_URL
GIPHY_API_KEY = indexData.giphy_api_key || "" GIPHY_API_KEY = indexData.giphy_api_key || ""
GIPHY_HOMESERVER = indexData.giphy_homeserver || GIPHY_HOMESERVER
GIPHY_MXC_PREFIX = indexData.giphy_mxc_prefix || GIPHY_MXC_PREFIX
// TODO only load pack metadata when scrolled into view? // TODO only load pack metadata when scrolled into view?
for (const packFile of indexData.packs) { for (const packFile of indexData.packs) {
let packRes let packRes
@ -386,22 +380,6 @@ class App extends Component {
} }
return html`<main class="has-content ${theme}"> return html`<main class="has-content ${theme}">
<style>
a.tab {
padding: 5% 5%;
width: 40%;
text-align: center;
border: none;
background-color: #f0f0f0;
cursor: pointer;
-webkit-appearance: button;
-moz-appearance: button;
appearance: button;
text-decoration: none;
color: initial;
}
</style>
<div class="tab-container" style="display: flex;"> <div class="tab-container" style="display: flex;">
<a href="#stickers" class="tab" onClick=${() => this.setState({ activeTab: "stickers" })}>Stickers</a> <a href="#stickers" class="tab" onClick=${() => this.setState({ activeTab: "stickers" })}>Stickers</a>
<a href="#gifs" class="tab" onClick=${() => this.setState({ activeTab: "gifs" })}>GIFs</a> <a href="#gifs" class="tab" onClick=${() => this.setState({ activeTab: "gifs" })}>GIFs</a>

2
web/style/index.css

@ -1 +1 @@
*{font-family:sans-serif}body{margin:0}h1{font-size:1rem}:root{--stickers-per-row: 4;--sticker-size: calc(100vw / var(--stickers-per-row))}main{color:var(--text-color)}main.spinner{margin-top:5rem}main.error,main.empty{margin:2rem}main.empty{text-align:center}main.has-content{position:fixed;top:0;left:0;right:0;bottom:0;display:grid;grid-template-rows:calc(12vw + 2px) min-content auto}main.theme-light{--highlight-color: #eee;--search-box-color: var(--highlight-color);--text-color: black;background-color:#fff}main.theme-dark{--highlight-color: #444;--search-box-color: #383e4b;--text-color: white;background-color:#22262e}main.theme-black{--highlight-color: #222;--search-box-color: var(--highlight-color);--text-color: white;background-color:#000}.icon{width:100%;height:100%;background-color:var(--text-color);mask-size:contain;-webkit-mask-size:contain;mask-image:var(--icon-image);-webkit-mask-image:var(--icon-image)}.icon.icon-settings{--icon-image: url(../res/settings.svg)}.icon.icon-recent{--icon-image: url(../res/recent.svg)}.icon.icon.icon-search{--icon-image: url(../res/search.svg)}nav{display:flex;overflow-x:auto}nav>a{border-bottom:2px solid transparent}nav>a.visible{border-bottom-color:green}nav>a>div.sticker{width:12vw;height:12vw}div.pack-list,nav{scrollbar-width:none}div.pack-list::-webkit-scrollbar,nav::-webkit-scrollbar{display:none}div.pack-list{overflow-y:auto}div.pack-list.ios-safari-hack{position:fixed;top:calc(calc(12vw + 2px) + calc(2 * 0.7rem + 2 * 0.5rem + 1rem));bottom:0;left:0;right:0;-webkit-overflow-scrolling:touch}div.search-empty{margin:1.2rem;text-align:center}section.stickerpack{margin-top:.75rem}section.stickerpack>div.sticker-list{display:flex;flex-wrap:wrap}section.stickerpack>h1{margin:0 0 0 .75rem}div.sticker{display:flex;padding:4px;cursor:pointer;position:relative;width:var(--sticker-size);height:var(--sticker-size);box-sizing:border-box}div.sticker:hover{background-color:var(--highlight-color)}div.sticker>img{display:none;width:100%;object-fit:contain}div.sticker>img.visible{display:initial}div.sticker>.icon{width:70%;height:70%;margin:15%}div.search-box{position:relative;display:flex}div.search-box>input[type=text]{flex-grow:1;background-color:var(--search-box-color);outline:none;border:none;border-radius:.25rem;height:1rem;padding:.7rem;padding-right:calc(1rem + 0.7rem);margin:.5rem;font-size:1rem;color:var(--text-color)}div.search-box>span.icon{display:flex;position:absolute;top:calc(50% - 1rem / 2);right:1rem;width:1rem;height:1rem;box-sizing:border-box}div.settings-list{display:flex;flex-direction:column}div.settings-list>*{margin:.5rem}div.settings-list button{padding:.5rem;border-radius:.25rem}div.settings-list input{width:100%}
*{font-family:sans-serif}body{margin:0}h1{font-size:1rem}:root{--stickers-per-row: 4;--sticker-size: calc(100vw / var(--stickers-per-row))}main{color:var(--text-color)}main.spinner{margin-top:5rem}main.error,main.empty{margin:2rem}main.empty{text-align:center}main.has-content{position:fixed;top:0;left:0;right:0;bottom:0;display:grid;grid-template-rows:calc(12vw + 2px) min-content auto}main.theme-light{--highlight-color: #eee;--search-box-color: var(--highlight-color);--text-color: black;background-color:#fff}main.theme-dark{--highlight-color: #444;--search-box-color: #383e4b;--text-color: white;background-color:#22262e}main.theme-black{--highlight-color: #222;--search-box-color: var(--highlight-color);--text-color: white;background-color:#000}.icon{width:100%;height:100%;background-color:var(--text-color);mask-size:contain;-webkit-mask-size:contain;mask-image:var(--icon-image);-webkit-mask-image:var(--icon-image)}.icon.icon-settings{--icon-image: url(../res/settings.svg)}.icon.icon-recent{--icon-image: url(../res/recent.svg)}.icon.icon.icon-search{--icon-image: url(../res/search.svg)}nav{display:flex;overflow-x:auto}nav>a{border-bottom:2px solid rgba(0,0,0,0)}nav>a.visible{border-bottom-color:green}nav>a>div.sticker{width:12vw;height:12vw}div.pack-list,nav{scrollbar-width:none}div.pack-list::-webkit-scrollbar,nav::-webkit-scrollbar{display:none}div.pack-list{overflow-y:auto}div.pack-list.ios-safari-hack{position:fixed;top:calc(calc(12vw + 2px) + calc(2 * 0.7rem + 2 * 0.5rem + 1rem));bottom:0;left:0;right:0;-webkit-overflow-scrolling:touch}div.search-empty{margin:1.2rem;text-align:center}section.stickerpack{margin-top:.75rem}section.stickerpack>div.sticker-list{display:flex;flex-wrap:wrap}section.stickerpack>h1{margin:0 0 0 .75rem}div.sticker{display:flex;padding:4px;cursor:pointer;position:relative;width:var(--sticker-size);height:var(--sticker-size);box-sizing:border-box}div.sticker:hover{background-color:var(--highlight-color)}div.sticker>img{display:none;width:100%;object-fit:contain}div.sticker>img.visible{display:initial}div.sticker>.icon{width:70%;height:70%;margin:15%}div.search-box{position:relative;display:flex}div.search-box>input[type=text]{flex-grow:1;background-color:var(--search-box-color);outline:none;border:none;border-radius:.25rem;height:1rem;padding:.7rem;padding-right:calc(1rem + 0.7rem);margin:.5rem;font-size:1rem;color:var(--text-color)}div.search-box>span.icon{display:flex;position:absolute;top:calc(50% - 1rem/2);right:1rem;width:1rem;height:1rem;box-sizing:border-box}div.settings-list{display:flex;flex-direction:column}div.settings-list>*{margin:.5rem}div.settings-list button{padding:.5rem;border-radius:.25rem}div.settings-list input{width:100%}a.tab{padding:5% 5%;width:40%;text-align:center;border:none;background-color:#f0f0f0;cursor:pointer;-webkit-appearance:button;-moz-appearance:button;appearance:button;text-decoration:none;color:initial}

12
web/style/index.sass

@ -204,4 +204,16 @@ div.settings-list
input input
width: 100% width: 100%
a.tab
padding: 5% 5%
width: 40%
text-align: center
border: none
background-color: #f0f0f0
cursor: pointer
-webkit-appearance: button
-moz-appearance: button
appearance: button
text-decoration: none
color: initial
Loading…
Cancel
Save