Skip to content
This repository was archived by the owner on Dec 16, 2024. It is now read-only.

Commit 01d690c

Browse files
authored
Add route for extension auth + Modq improvements (#1013)
1 parent 7d2692d commit 01d690c

File tree

10 files changed

+752
-121
lines changed

10 files changed

+752
-121
lines changed

src/apollo/query/mod-queue.query.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ import gql from "graphql-tag";
22
import { Message } from "@/structures/Message";
33

44
export const GetModRequests = gql`
5-
query GetModRequests($after: ObjectID, $limit: Int, $wish: String) {
6-
modRequests(after_id: $after, limit: $limit, wish: $wish) {
5+
query GetModRequests($after: ObjectID, $limit: Int, $wish: String, $country: String) {
6+
modRequests(after_id: $after, limit: $limit, wish: $wish, country: $country) {
77
total
88
messages {
99
id

src/components/form/TextInput.vue

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
:error="error"
77
:autofocus="autofocus"
88
:value="modelValue"
9+
:maxlength="maxlength"
910
:empty="typeof modelValue === 'string' ? !modelValue?.length : typeof modelValue !== 'number'"
1011
@input="onInput"
1112
@blur="emit('blur')"
@@ -37,6 +38,7 @@ const props = withDefaults(
3738
width?: string;
3839
appearance?: "flat" | "outline";
3940
autofocus?: boolean;
41+
maxlength?: number;
4042
}>(),
4143
{
4244
type: "text",

src/components/form/Toggle.vue

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
<template>
2+
<div class="seventv-toggle-outer">
3+
<span v-if="left" class="seventv-toggle-option">
4+
{{ left }}
5+
</span>
6+
<label class="seventv-toggle-switch" :for="id">
7+
<input :id="id" v-model="value" tabindex="0" type="checkbox" @change="$emit('update:modelValue', value)" />
8+
<div class="seventv-toggle round"></div>
9+
</label>
10+
<span v-if="right" class="seventv-toggle-option">
11+
{{ right }}
12+
</span>
13+
</div>
14+
</template>
15+
16+
<script setup lang="ts">
17+
import { ref } from "vue";
18+
19+
const props = defineProps<{
20+
id: string;
21+
left?: string;
22+
right?: string;
23+
modelValue: boolean;
24+
}>();
25+
26+
const value = ref(props.modelValue);
27+
28+
defineEmits<{
29+
(e: "update:modelValue", value: boolean): void;
30+
}>();
31+
</script>
32+
33+
<style scoped lang="scss">
34+
.seventv-toggle-outer {
35+
display: flex;
36+
flex-wrap: nowrap;
37+
align-items: center;
38+
gap: 0.8rem;
39+
}
40+
41+
.seventv-toggle-option {
42+
font-size: 1rem;
43+
font-weight: 600;
44+
vertical-align: center;
45+
}
46+
47+
.seventv-toggle-switch {
48+
display: inline-block;
49+
height: 1rem;
50+
position: relative;
51+
width: 2rem;
52+
}
53+
54+
.seventv-toggle {
55+
inset: 0;
56+
cursor: pointer;
57+
position: absolute;
58+
transition: 0.25s;
59+
outline: 0.01rem solid currentcolor;
60+
}
61+
62+
.seventv-toggle::before {
63+
bottom: 0.15rem;
64+
content: "";
65+
height: 0.7rem;
66+
left: 0.15rem;
67+
position: absolute;
68+
transition: 0.25s;
69+
width: 0.7rem;
70+
background-color: currentcolor;
71+
}
72+
73+
input {
74+
opacity: 0;
75+
76+
&:focus + .seventv-toggle {
77+
outline: 0.1rem solid black;
78+
}
79+
80+
&:checked + .seventv-toggle::before {
81+
transform: translateX(1rem);
82+
}
83+
}
84+
85+
.seventv-toggle.round {
86+
border-radius: 0.25rem;
87+
}
88+
89+
.seventv-toggle.round::before {
90+
border-radius: 0.25rem;
91+
}
92+
</style>

src/components/utility/EmoteCard.vue

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
class="img-wrapper"
1717
:censor="!emote.state.includes('LISTED') && !actor.hasPermission(Permissions.EditAnyEmote)"
1818
>
19-
<img v-if="src" :src="src" />
19+
<img v-if="src" :loading="lazy ? 'lazy' : undefined" :src="src" />
2020
</div>
2121
<div class="img-gap" />
2222
<div class="title-banner">
@@ -91,10 +91,12 @@ const props = withDefaults(
9191
personalContext?: boolean;
9292
decorative?: boolean;
9393
hideIndicators?: boolean;
94+
lazy?: boolean;
9495
}>(),
9596
{
9697
emote: () => ({ id: "" } as Emote),
9798
scale: "10em",
99+
lazy: false,
98100
},
99101
);
100102

src/router/auth.route.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { RouteRecordRaw } from "vue-router";
2+
3+
export const ExtensionAuthRoute = {
4+
path: "/extension/auth",
5+
name: "ExtensionAuth",
6+
component: () => import("@/views/ExtensionAuth.vue"),
7+
} as RouteRecordRaw;

src/router/router.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { RouteRecordRaw, createRouter, createWebHistory } from "vue-router";
22
import { AdminRoute } from "./admin.route";
3+
import { ExtensionAuthRoute } from "./auth.route";
34
import { CallbackRoute } from "./callback.route";
45
import { EmoteSetRoute } from "./emote-sets.route";
56
import { EmotesRoute } from "./emotes.route";
@@ -21,6 +22,7 @@ const routes: Array<RouteRecordRaw> = [
2122
InboxRoute,
2223
AdminRoute,
2324
...CallbackRoute,
25+
ExtensionAuthRoute,
2426
{
2527
path: "/:pathMatch(.*)*",
2628
name: "Not Found",

src/views/ExtensionAuth.vue

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
<template>
2+
<div class="extension-auth-content">
3+
<LoginButton v-if="!actor.user" />
4+
</div>
5+
</template>
6+
7+
<script setup lang="ts">
8+
import { watch } from "vue";
9+
import { useActor } from "@/store/actor";
10+
import { useStore } from "@/store/main";
11+
import LoginButton from "@/components/utility/LoginButton.vue";
12+
13+
const store = useStore();
14+
const actor = useActor();
15+
window.addEventListener("message", function listener(e) {
16+
if (e.origin !== "https://www.twitch.tv") return;
17+
if (e.data !== "7tv-token-request") return;
18+
window.removeEventListener("message", listener);
19+
watch(
20+
() => store.authToken,
21+
(t) => {
22+
if (!t) return;
23+
e.source?.postMessage({ type: "7tv-token", token: t }, { targetOrigin: "https://www.twitch.tv/*" });
24+
},
25+
{ immediate: true },
26+
);
27+
});
28+
</script>
29+
30+
<style lang="scss">
31+
nav {
32+
display: none;
33+
}
34+
.extension-auth-content {
35+
display: flex;
36+
margin: auto;
37+
justify-content: center;
38+
}
39+
</style>

0 commit comments

Comments
 (0)