Git Product home page Git Product logo

react-github-permalink's Introduction

React Github Permalink

Display Github permalinks as codeblocks.

Display Github issue links.

screenshot of the tool in action - dark mode screenshot of the tool in action - light mode screenshot of the tool in action - light mode screenshot of the tool in action - light mode

I highly rate the vscode-copy-github-permalink plugin for ease in generating the permalinks from within VSCode.

Demo

https://codesandbox.io/s/exciting-nova-js5zlk?file=/src/App.js

RSC Compatibility / Three modes of operation

This package is compatible with Next 13+ and the components can be used as RSCs if you wish.

Three variants of each component are exported

  • GithubPermalink/GithubIssueLink - Client component - It fetches the data as on the client in a useEffect. ie. Data won't be retrieved until application has loaded in user's browser.
  • GithubPermalinkBase/GithubIssueLinkBase - this is the base component - it does no data fetching on its own.
  • GithubPermalinkRsc/GithubIssueLinkRsc - This is an RSC.

Basic usage (Client component)

import { GithubPermalink } from 'react-github-permalink';
import "react-github-permalink/dist/github-permalink.css"; // Or provide your own styles

export function MyApp() {
    return  <GithubPermalink permalink="https://github.com/dwjohnston/react-github-permalink/blob/5b15aa07e60af4e317086f391b28cadf9aae8e1b/sample_files/sample1.go#L1-L5"/>
}

Provide your own data

import { GithubPermalinkBase } from 'react-github-permalink';
import "react-github-permalink/dist/github-permalink.css"; // Or provide your own styles

export function MyApp() {
    return          <GithubPermalinkBase
            permalink="https://github.com/dwjohnston/react-github-permalink/blob/5b15aa07e60af4e317086f391b28cadf9aae8e1b/sample_files/sample1.go#L1-L5"
            data={{
                lines: [
                    "package main",
                    "import \"fmt\"",
                    "func main() {",
                    "    fmt.Println(\"hello world\")",
                    "}"
                ],
                lineFrom: 1,
                lineTo: 5,
                commit: "5b15aa07e60af4e317086f391b28cadf9aae8e1b",
                path: "sample_files/sample1.go",
                owner: "dwjohnston",
                repo: "react-github-permalink",
                commitUrl: "https://github.com/dwjohnston/react-github-permalink/commit/5b15aa07e60af4e317086f391b28cadf9aae8e1b",
                status: "ok"
            }} />
}

You may wish you use this approach if my approach for configuration does not work for you

RSC

import { GithubPermalinkRsc } from 'react-github-permalink/dist/rsc';
import "react-github-permalink/dist/github-permalink.css"; // Or provide your own styles

export function MyApp() {
    return  <GithubPermalinkRsc permalink="https://github.com/dwjohnston/react-github-permalink/blob/5b15aa07e60af4e317086f391b28cadf9aae8e1b/sample_files/sample1.go#L1-L5"/>
}

Note that import path is different.

Github Issuelink

Usage

import { GithubPermalink } from 'react-github-permalink';
import "react-github-permalink/dist/github-permalink.css"; // Or provide your own styles

export function MyApp() {
    return  <GithubIssueLink issueLink='https://github.com/dwjohnston/react-github-permalink/issues/2' />,
}

Rate Limits and Authentication

By default the components make unauthenticated requests against Github's API. The rate limit for such requests is 60/hour and only publicly visible repositories are available.

If you need to avoid rate limits or allow users to view private repos, you can implement your own data fetching function.

Configuration

The global configuration object has this signature

type BaseConfiguration = {
    getDataFn: (permalink: string, githubToken?: string | undefined, onError?: ((err: unknown) => void) | undefined) => Promise<GithubPermalinkDataResponse>;
    getIssueFn: (issueLink: string, githubToken?: string | undefined, onError?: ((err: unknown) => void) | undefined) => Promise<GithubIssueLinkDataResponse>;
    githubToken: string | undefined;
    onError: ((e: unknown) => void) | undefined;
}

Configure client components via GithubPermalinkProvider

Client components are configured via context provider:

import { GithubPermalink, GithubIssueLink GithubPermalinkProvider,  } from 'react-github-permalink';
import "react-github-permalink/dist/github-permalink.css";

export function MyApp() {
    return <GithubPermalinkProvider 
        getDataFn ={(permalink: string) => {
            // Your implementation to retrieve permalinks here 
        }}
        getIssueFn={(issueLink: string) => {
            // Your implementation to retrieve issue links here
        }}

        // Don't put a put a github token into the context provider in production! It will visible for all the world to see!
        // Instead you will need to expose a data fetching function on the backend to do it for you 
        githubToken={process.env.NODE_ENV='development' && process.env.MY_GITHUB_TOKEN}

        onError={(err) => {
            Sentry.captureException(err);
        }}
    >  
        <GithubPermalink permalink="https://github.com/dwjohnston/react-github-permalink/blob/5b15aa07e60af4e317086f391b28cadf9aae8e1b/sample_files/sample1.go#L1-L5"/>
        <GithubIssueLink issueLink='https://github.com/dwjohnston/react-github-permalink/issues/2' />
    </GithubPermalinkProvider>
}    

Configure RSC components via githubPermalinkRscConfig singleton

In a Next.js 13 app using the app router, I recommend configuring the githubPermalinkRscConfig object in your route level layout.tsx file.

import "react-github-permalink/dist/github-permalink.css";
import {githubPermalinkRscConfig} from "react-github-permalink/dist/rsc";
githubPermalinkRscConfig.setConfig({
  githubToken: process.env.GITHUB_TOKEN
})

export default function RootLayout({
  children,
}: Readonly<{
  children: React.ReactNode;
}>) {
   // your layout component here 
}

react-github-permalink's People

Contributors

dwjohnston avatar

Stargazers

Xiangxi Guo (Ryan) avatar Demian Parkhomenko avatar

Watchers

 avatar

react-github-permalink's Issues

Improve release process.

Currently I'm just publishing manually. Might pay to add a build pipeline, release on merge to master. Might be a good chance to play with changesets

Single line permalinks don't work.

eg:

<GithubPermalink permalink="https://github.com/dwjohnston/blacksheepcode/blob/72ee472bfa896df255ae42ef017ad0cca96b2333/app/components/PostComments/PostComments.tsx#L28"/>

Won't render anything.

Make RSCs

For use a blog that uses RSCs (eg NextJs) rendering the code blocks on the backend might be helpful. For this, RSCs would be helpful.

Feasibility of making this work with pure markdown blog post

Hey, I got here from reddit, and this tool seems great, thanks for making it:).

I'm wondering how feasible is it to make this work with this other project called zero-md? Basically I'm trying to write some blog post in pure markdown, and render it in HTML. But looks like zero-md uses another project to parse the markdown source -- marked.

So to extend zero-md with displaying github permalink, we'd have to go tweak marked? Do you have some other idea?

Add emoji reacts for issues/prs

Often for a common issue the top level comment will have a bunch of thumbs up reacts, showing there's a lot of community sentiment regarding that issue.

It would be good to include those in the issue links.

Add diffing.

Sometimes it might be helpful to show the diff between commits rather than just the state at a given commit.

Admittedly this is likely a much harder task, but might be useful. :)

Add Stack Overflow links

I'm frequently linking to stack overflow questions as well - it might be nice to have a similar component for linking to Stack Overflow.

Add inline variants of the the issue link or PR links.

Sometimes it might be nice have a Issue/PR show up as an small inline component.

Eg. we have block of text:

This issue is due to foo. This issue [Inline Component Here] address this. Blah blah blah.

Perhaps further details can be given on hover.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.