-
Notifications
You must be signed in to change notification settings - Fork 11
/
utils.ts
112 lines (92 loc) · 2.24 KB
/
utils.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
export const buildProfileUrl = (screenName: string, userId?: string) => {
if (!screenName) {
return ''
}
if (userId) {
return `https://twitter.com/intent/user?user_id=${userId}&screen_name=${screenName}`
}
return `https://twitter.com/${screenName}/`
}
export const getPublisherNameFromPage = () => {
const components = document.title.split('(@')
if (!components ||
components.length <= 1 ||
components[0] === document.title) {
return ''
}
return components[0].trim()
}
export const getTweetId = (tweet: Element, isNewTwitter: boolean) => {
if (!tweet) {
return null
}
if (!isNewTwitter) {
return tweet.getAttribute('data-tweet-id')
}
const status = tweet.querySelector("a[href*='/status/']") as HTMLAnchorElement
if (!status || !status.href) {
return null
}
const tweetIdMatches = status.href.match(/status\/(\d+)/)
if (!tweetIdMatches || tweetIdMatches.length < 2) {
return null
}
return tweetIdMatches[1]
}
export const getScreenNameFromUrl = (url: URL) => {
const searchParams = new URLSearchParams(url.search)
if (!searchParams) {
return ''
}
const screenName = searchParams.get('screen_name')
if (screenName) {
return unescape(screenName)
}
if (!url.pathname) {
return ''
}
const pathComponents = url.pathname.split('/').filter(item => item)
if (!pathComponents || pathComponents.length === 0) {
return ''
}
return pathComponents[0]
}
export const isExcludedPath = (path: string) => {
const paths = [
'/',
'/about',
'/home',
'/login',
'/logout',
'/messages',
'/privacy',
'/search',
'/settings',
'/tos'
]
if (paths.includes(path)) {
return true
}
const startPatterns = [
'/account/',
'/compose/',
'/explore',
'/hashtag/',
'/i/',
'/messages/',
'/notifications',
'/settings/',
'/who_to_follow/',
'/?login',
'/?logout'
]
for (const pattern of startPatterns) {
if (path.startsWith(pattern)) {
return true
}
}
return false
}