1
0
mirror of https://github.com/uetchy/namae.git synced 2025-03-17 04:30:31 +09:00

feat: rubygems

This commit is contained in:
uetchy 2019-08-02 16:27:05 +09:00
parent d856caadde
commit 72a70fe1a4
5 changed files with 72 additions and 4 deletions

20
api/services/rubygems.js Normal file
View File

@ -0,0 +1,20 @@
const fetch = require('isomorphic-unfetch')
const { send, sendError } = require('../util/http')
module.exports = async (req, res) => {
const name = req.query.name
if (!name) {
return res.status(400).json({ error: 'no query given' })
}
try {
const response = await fetch(
`https://rubygems.org/gems/${encodeURIComponent(name)}`
)
const availability = response.status !== 200
send(res, availability)
} catch (err) {
sendError(res, err)
}
}

View File

@ -17,6 +17,7 @@ import JsOrgCard from './components/cards/JsOrgCard'
import PypiCard from './components/cards/PypiCard'
import S3Card from './components/cards/S3Card'
import CratesioCard from './components/cards/CratesioCard'
import RubyGemsCard from './components/cards/RubyGemsCard'
import { EventReporter } from './components/Analytics'
export default function App() {
@ -47,6 +48,7 @@ export default function App() {
<JsOrgCard name={query} />
<PypiCard name={query} />
<CratesioCard name={query} />
<RubyGemsCard name={query} />
<HomebrewCard name={query} />
<TwitterCard name={query} />
<SlackCard name={query} />
@ -88,7 +90,7 @@ body {
`
const Content = styled.div`
padding-top: 80px;
padding-top: 100px;
${mobile} {
padding-top: 60px;

View File

@ -130,6 +130,30 @@ export function ExistentialAvailability({
)
}
export function CustomAvailability({
name,
target,
link,
prefix = '',
suffix = '',
icon,
children,
}) {
const response = useFetch(target, null, { metadata: true })
const availability = children(response)
return (
<Result
name={name}
availability={availability}
link={link}
prefix={prefix}
suffix={suffix}
icon={icon}
/>
)
}
const Container = styled.div`
min-height: 1em;
display: flex;

View File

@ -4,7 +4,7 @@ import styled from 'styled-components'
import { AvailabilityContainer } from './Availability'
import { mobile } from '../util/css'
export function Card({ title, nameList, alternativeList = [], children }) {
export function Card({ title, nameList = [], alternativeList = [], children }) {
const [revealAlternatives, setRevealAlternatives] = useState(false)
function onClick() {
@ -77,11 +77,10 @@ const CardList = styled.div`
const ShowAlternativesButton = styled.div`
display: inline-block;
margin-top: 10px;
padding: 5px 0;
border: none;
border-bottom: 1px dashed black;
cursor: pointer;
font-family: monospace;
font-size: 1rem;
font-size: 0.8em;
`

View File

@ -0,0 +1,23 @@
import React from 'react'
import { FaGem } from 'react-icons/fa'
import { Card } from '../Cards'
import { DedicatedAvailability } from '../Availability'
export default function RubyGemsCard({ name }) {
return (
<Card
title="RubyGems"
key={name}
nameList={[name]}
alternativeList={[`${name.toLowerCase()}-rb`]}>
{(name) => (
<DedicatedAvailability
name={name}
service="rubygems"
link={`https://rubygems.org/gems/${name}`}
icon={<FaGem />}
/>
)}
</Card>
)
}