diff --git a/go.mod b/go.mod
index 53468c09..048b19f8 100644
--- a/go.mod
+++ b/go.mod
@@ -3,26 +3,17 @@ module github.com/imdotdev/im.dev
go 1.14
require (
- 9fans.net/go v0.0.2 // indirect
github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef
github.com/gin-gonic/gin v1.6.3
github.com/go-stack/stack v1.8.0
github.com/golang/snappy v0.0.2
github.com/gosimple/slug v1.9.0
+ github.com/grafana/grafana v5.4.5+incompatible
github.com/inconshreveable/log15 v0.0.0-20201112154412-8562bdadbbac
- github.com/karrick/godirwalk v1.16.1 // indirect
- github.com/keegancsmith/rpc v1.3.0 // indirect
+ github.com/lithammer/shortuuid/v3 v3.0.5
github.com/mattn/go-sqlite3 v1.14.6
- github.com/newhook/go-symbols v0.0.0-20151212134530-b75dfefa0d23 // indirect
- github.com/pkg/errors v0.9.1 // indirect
- github.com/ramya-rao-a/go-outline v0.0.0-20200117021646-2a048b4510eb // indirect
- github.com/rogpeppe/godef v1.1.2 // indirect
github.com/spf13/cobra v1.1.1
github.com/spf13/pflag v1.0.5
- github.com/stamblerre/gocode v1.0.0 // indirect
- github.com/uudashr/gopkgs v1.3.2 // indirect
- golang.org/x/mod v0.4.1 // indirect
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c // indirect
- golang.org/x/tools v0.1.0 // indirect
gopkg.in/yaml.v2 v2.2.8
)
diff --git a/go.sum b/go.sum
index 64467362..f6f2165e 100644
--- a/go.sum
+++ b/go.sum
@@ -1,7 +1,3 @@
-9fans.net/go v0.0.0-20181112161441-237454027057 h1:OcHlKWkAMJEF1ndWLGxp5dnJQkYM/YImUOvsBoz6h5E=
-9fans.net/go v0.0.0-20181112161441-237454027057/go.mod h1:diCsxrliIURU9xsYtjCp5AbpQKqdhKmf0ujWDUSkfoY=
-9fans.net/go v0.0.2 h1:RYM6lWITV8oADrwLfdzxmt8ucfW6UtP9v1jg4qAbqts=
-9fans.net/go v0.0.2/go.mod h1:lfPdxjq9v8pVQXUMBCx5EO5oLXWQFlKRQgs1kEkjoIM=
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
@@ -38,6 +34,7 @@ github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
@@ -52,6 +49,7 @@ github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
+github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A=
github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q=
github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8=
@@ -84,12 +82,17 @@ github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXi
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
+github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y=
+github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/gosimple/slug v1.9.0 h1:r5vDcYrFz9BmfIAMC829un9hq7hKM4cHUrsv36LbEqs=
github.com/gosimple/slug v1.9.0/go.mod h1:AMZ+sOVe65uByN3kgEyf9WEBKBCSS+dJjMX9x4vDJbg=
+github.com/grafana/grafana v1.9.1 h1:4ykSOyQ+qImmZmILEgqsokVnWmvR8/A0zt7jN2RAQxM=
+github.com/grafana/grafana v5.4.5+incompatible h1:xNuhSBxLgwDwesuQIAhQu1QCk6tD0TAghKHE36/hxrs=
+github.com/grafana/grafana v5.4.5+incompatible/go.mod h1:U8QyUclJHj254BFcuw45p6sg7eeGYX44qn1ShYo5rGE=
github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
@@ -115,28 +118,28 @@ github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2p
github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
github.com/inconshreveable/log15 v0.0.0-20201112154412-8562bdadbbac h1:n1DqxAo4oWPMvH1+v+DLYlMCecgumhhgnxAPdqDIFHI=
github.com/inconshreveable/log15 v0.0.0-20201112154412-8562bdadbbac/go.mod h1:cOaXtrgN4ScfRrD9Bre7U1thNq5RtJ8ZoP4iXVGRj6o=
+github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
+github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGns=
github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
-github.com/karrick/godirwalk v1.16.1 h1:DynhcF+bztK8gooS0+NDJFrdNZjJ3gzVzC545UNA9iw=
-github.com/karrick/godirwalk v1.16.1/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk=
-github.com/keegancsmith/rpc v1.1.0 h1:bXVRk3EzbtrEegTGKxNTc+St1lR7t/Z1PAO8misBnCc=
-github.com/keegancsmith/rpc v1.1.0/go.mod h1:Xow74TKX34OPPiPCdz6x1o9c0SCxRqGxDuKGk7ZOo8s=
-github.com/keegancsmith/rpc v1.3.0 h1:wGWOpjcNrZaY8GDYZJfvyxmlLljm3YQWF+p918DXtDk=
-github.com/keegancsmith/rpc v1.3.0/go.mod h1:6O2xnOGjPyvIPbvp0MdrOe5r6cu1GZ4JoTzpzDhWeo0=
github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
+github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
+github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y=
github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII=
+github.com/lithammer/shortuuid/v3 v3.0.5 h1:cUCI9JNIWsjVThijRm4K3jInhXZj8+xJxbUGNfm84ms=
+github.com/lithammer/shortuuid/v3 v3.0.5/go.mod h1:2QdoCtD4SBzugx2qs3gdR3LXY6McxZYCNEHwDmYvOAE=
github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
github.com/mattn/go-colorable v0.0.9 h1:UVL0vNpWh04HeJXV0KLcaT7r06gOH2l4OW6ddYRUIY4=
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
@@ -157,20 +160,19 @@ github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0Qu
github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI=
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
-github.com/newhook/go-symbols v0.0.0-20151212134530-b75dfefa0d23 h1:bXKgb2O/gIrZd/smUeP3OJcAt1ey3UV+cPYT+mRUNzs=
-github.com/newhook/go-symbols v0.0.0-20151212134530-b75dfefa0d23/go.mod h1:9RIESfVnNNAkdTKNuEYS0rEkXXM2HYfchPD4xXNx1CU=
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
-github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
-github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
@@ -184,12 +186,8 @@ github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7z
github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
github.com/rainycape/unidecode v0.0.0-20150907023854-cb7f23ec59be h1:ta7tUOvsPHVHGom5hKW5VXNc2xZIkfCKP8iaqOyYtUQ=
github.com/rainycape/unidecode v0.0.0-20150907023854-cb7f23ec59be/go.mod h1:MIDFMn7db1kT65GmV94GzpX9Qdi7N/pQlwb+AN8wh+Q=
-github.com/ramya-rao-a/go-outline v0.0.0-20200117021646-2a048b4510eb h1:ilZSL4VaIq4Hsi+lH928xQKnSWymFug6r2gJomUBpW8=
-github.com/ramya-rao-a/go-outline v0.0.0-20200117021646-2a048b4510eb/go.mod h1:1WL5IqM+CnRCAbXetRnL1YVoS9KtU2zMhOi/5oAVPo4=
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
-github.com/rogpeppe/godef v1.1.2 h1:c5mCx0EcCORJOdVMREX7Lgh1raTxAHFmOfXdEB9u8Jw=
-github.com/rogpeppe/godef v1.1.2/go.mod h1:WtY9A/ovuQ+UakAJ1/CEqwwulX/WJjb2kgkokCHi/GY=
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
@@ -208,12 +206,11 @@ github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
-github.com/stamblerre/gocode v1.0.0 h1:5aTRgkRTOS8mELHoKatkwhfX44OdEV3iwu3FCXyvLzk=
-github.com/stamblerre/gocode v1.0.0/go.mod h1:ONyGamdxpnxaG2+XLyGkNuuoYISmz0QFVHScxvsXsqM=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
@@ -221,10 +218,7 @@ github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo=
github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw=
github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs=
github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY=
-github.com/uudashr/gopkgs v1.3.2 h1:ACme7LZyeSNIRIl9HtAA0RsT0eePUsrkHDVb2+aswhg=
-github.com/uudashr/gopkgs v1.3.2/go.mod h1:MtCdKVJkxW7hNKWXPNWfpaeEp8+Ml3Q8myb4yWhn2Hg=
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
-github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
@@ -236,8 +230,6 @@ golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnf
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -256,11 +248,6 @@ golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU
golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
-golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
-golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4=
-golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/mod v0.4.1 h1:Kvvh58BN8Y9/lBi7hTekvtMpm07eUZ0ck5pRHpsMWrY=
-golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -275,7 +262,6 @@ golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -284,7 +270,6 @@ golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -300,15 +285,11 @@ golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200116001909-b77594299b42 h1:vEOn+mP2zCOVzKckCZy6YsCtDblrpj/w7B9nxGNELpg=
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4 h1:myAQVi0cGEoqQVR5POX+8RR2mrocKqNN1hmeMqhX27k=
-golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c h1:VwygUrnw9jn88c4u8GD3rZQbqrP/tgas88tPUbBxQrk=
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
-golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
@@ -327,17 +308,9 @@ golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgw
golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191030062658-86caa796c7ab/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc h1:NCy3Ohtk6Iny5V/reW2Ktypo4zIpWBdRJ1uFMjBxdg8=
golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20200226224502-204d844ad48d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.1.0 h1:po9/4sTYwZU9lPhi1tOrb4hCv3qrhiQ77LZfGa2OjwY=
-golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
-golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
@@ -361,6 +334,7 @@ google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiq
google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
diff --git a/layouts/nav/editor-nav.tsx b/layouts/nav/editor-nav.tsx
index 3960e13f..d8b81117 100644
--- a/layouts/nav/editor-nav.tsx
+++ b/layouts/nav/editor-nav.tsx
@@ -29,6 +29,7 @@ import { Tag } from "src/types/tag"
import { cloneDeep, remove } from "lodash"
import { requestApi } from "utils/axios/request"
import DarkMode from "components/dark-mode"
+import EditModeSelect from "components/edit-mode-select"
@@ -56,15 +57,6 @@ function HeaderContent(props: any) {
},[props.ar])
- const editOptions = [EditMode.Edit, EditMode.Preview]
- const { getRootProps, getRadioProps } = useRadioGroup({
- name: "framework",
- defaultValue: EditMode.Edit,
- onChange: (v) => {
- props.changeEditMode(v)
- },
- })
- const group = getRootProps()
const addTag = t => {
setTags(t)
@@ -102,16 +94,7 @@ function HeaderContent(props: any) {
-
- {editOptions.map((value) => {
- const radio = getRadioProps({ value })
- return (
-
- {value}
-
- )
- })}
-
+
@@ -185,8 +168,6 @@ function EditorNav(props) {
bg={useColorModeValue('white','gray.800')}
left="0"
right="0"
- borderTop="4px solid"
- borderTopColor="teal.400"
width="full"
>
diff --git a/layouts/nav/nav.tsx b/layouts/nav/nav.tsx
index baebc059..aaa3a83f 100644
--- a/layouts/nav/nav.tsx
+++ b/layouts/nav/nav.tsx
@@ -125,8 +125,6 @@ function Header(props) {
zIndex="3"
left="0"
right="0"
- borderTop="4px solid"
- borderTopColor="teal.400"
width="full"
bg={useColorModeValue('white', 'gray.800')}
{...props}
diff --git a/layouts/nav/post-nav.tsx b/layouts/nav/post-nav.tsx
index 9a44b273..53d352f4 100644
--- a/layouts/nav/post-nav.tsx
+++ b/layouts/nav/post-nav.tsx
@@ -110,8 +110,6 @@ function PostNav(props) {
zIndex="3"
left="0"
right="0"
- borderTop="4px solid"
- borderTopColor="teal.400"
width="full"
bg={useColorModeValue('white', 'gray.800')}
{...props}
diff --git a/pages/[username]/[post_slug].tsx b/pages/[username]/[post_id].tsx
similarity index 68%
rename from pages/[username]/[post_slug].tsx
rename to pages/[username]/[post_id].tsx
index 1a8756de..8fb3d92c 100644
--- a/pages/[username]/[post_slug].tsx
+++ b/pages/[username]/[post_id].tsx
@@ -1,10 +1,13 @@
import { Box, chakra, Divider, Flex, Heading, HStack, IconButton, Image, VStack } from "@chakra-ui/react"
+import Comments from "components/comments/comments"
import Container from "components/container"
-import LikeButton from "components/like-button"
+import LikeButton from "components/posts/unicorn-like"
import { MarkdownRender } from "components/markdown-editor/render"
import PostAuthor from "components/posts/post-author"
+import TagTextCard from "components/posts/tag-text-card"
import SEO from "components/seo"
import siteConfig from "configs/site-config"
+import useSession from "hooks/use-session"
import Nav from "layouts/nav/nav"
import PostNav from "layouts/nav/post-nav"
import PageContainer from "layouts/page-container"
@@ -13,22 +16,34 @@ import { useRouter } from "next/router"
import { title } from "process"
import React, { useEffect, useState } from "react"
import { FaBookmark, FaGithub, FaRegBookmark, FaShare, FaShareAlt } from "react-icons/fa"
+import { ReserveUrls } from "src/data/reserve-urls"
+import { Comment } from "src/types/comments"
import { Post } from "src/types/posts"
+import { Tag } from "src/types/tag"
import { requestApi } from "utils/axios/request"
+import UnicornLike from "components/posts/unicorn-like"
const PostPage = () => {
const router = useRouter()
- const slug = router.query.post_slug
+ const id = router.query.post_id
const [post, setPost]: [Post, any] = useState(null)
-
+ const [comments,setComments]: [Comment[],any] = useState([])
+ const session = useSession()
useEffect(() => {
- if (slug) {
- requestApi.get(`/post/${slug}`).then(res => setPost(res.data))
+ if (id) {
+ getData()
}
- }, [slug])
+ }, [id])
+
+ const getData = async () => {
+ const res = await requestApi.get(`/post/${id}`)
+ setPost(res.data)
+
+ getComments(res.data.id)
+ }
const onLike = async () => {
- await requestApi.post(`/post/like/${post.id}`)
+ await requestApi.post(`/story/like/${post.id}`)
const p = cloneDeep(post)
if (post.liked) {
@@ -41,6 +56,12 @@ const PostPage = () => {
setPost(p)
}
+ const getComments = async (id) => {
+ const res = await requestApi.get(`/story/comments/${id}`)
+ console.log(res.data)
+ setComments(res.data)
+ }
+
return (
<>
{
{post &&
<>
-
+
- {post.title}
+ {post.title}
@@ -62,13 +83,16 @@ const PostPage = () => {
+ {post.rawTags.map(tag => )}
+
+ getComments(post.id)}/>
-
+
{/* */}
{/* */}
-
+
{/* */}
@@ -92,6 +116,18 @@ const PostPage = () => {
icon={}
/>
+
+ {post.creatorId === session?.user.id &&
+ router.push(`${ReserveUrls.Editor}/post/${post.id}`)}
+ icon={}
+ />
+ }
@@ -103,7 +139,7 @@ const PostPage = () => {
{/* */}
-
+
ar[j].Created.Unix()
+}
diff --git a/server/pkg/models/post.go b/server/pkg/models/post.go
index 779885d1..26fa74f6 100644
--- a/server/pkg/models/post.go
+++ b/server/pkg/models/post.go
@@ -2,22 +2,30 @@ package models
import "time"
+const (
+ StatusDraft = 1
+ StatusPublished = 2
+ StatusHidden = 3
+)
+
type Post struct {
- ID int64 `json:"id"`
- Creator *UserSimple `json:"creator"`
- CreatorID int64 `json:"creatorId"`
- Title string `json:"title"`
- Slug string `json:"slug"`
- Md string `json:"md"`
- URL string `json:"url"`
- Cover string `json:"cover"`
- Brief string `json:"brief"`
- Tags []int64 `json:"tags"`
- Likes int `json:"likes"`
- Liked bool `json:"liked"`
- Recommands int `json:"recommands"`
- Created time.Time `json:"created"`
- Updated time.Time `json:"updated"`
+ ID string `json:"id"`
+ Creator *UserSimple `json:"creator"`
+ CreatorID int64 `json:"creatorId"`
+ Title string `json:"title"`
+ Slug string `json:"slug"`
+ Md string `json:"md"`
+ URL string `json:"url"`
+ Cover string `json:"cover"`
+ Brief string `json:"brief"`
+ Tags []int64 `json:"tags"`
+ RawTags []*Tag `json:"rawTags"`
+ Likes int `json:"likes"`
+ Liked bool `json:"liked"`
+ Views int `json:"views"`
+ Status int `json:"status"`
+ Created time.Time `json:"created"`
+ Updated time.Time `json:"updated"`
}
type Posts []*Post
diff --git a/server/pkg/models/story.go b/server/pkg/models/story.go
new file mode 100644
index 00000000..1556693b
--- /dev/null
+++ b/server/pkg/models/story.go
@@ -0,0 +1,6 @@
+package models
+
+const (
+ StoryPost = "1"
+ StoryComment = "2"
+)
diff --git a/server/pkg/models/user.go b/server/pkg/models/user.go
index 6753ccc3..ce8233bf 100644
--- a/server/pkg/models/user.go
+++ b/server/pkg/models/user.go
@@ -17,7 +17,7 @@ type User struct {
Created time.Time `json:"created"`
}
-const DefaultAvatar = "https://placekitten.com/100/100"
+const DefaultAvatar = "https://cdn.hashnode.com/res/hashnode/image/upload/v1600792675173/rY-APy9Fc.png?auto=compress"
func (user *User) Query(id int64, username string, email string) error {
err := db.Conn.QueryRow(`SELECT id,username,role,nickname,email,avatar,last_seen_at,created FROM user WHERE id=? or username=? or email=?`,
diff --git a/server/pkg/utils/id.go b/server/pkg/utils/id.go
new file mode 100644
index 00000000..6557f6a7
--- /dev/null
+++ b/server/pkg/utils/id.go
@@ -0,0 +1,8 @@
+package utils
+
+import "github.com/lithammer/shortuuid/v3"
+
+func GenStoryID(storyType string) string {
+ u := shortuuid.New()
+ return storyType + u
+}
diff --git a/src/components/card.tsx b/src/components/card.tsx
index cde67f74..c6790521 100644
--- a/src/components/card.tsx
+++ b/src/components/card.tsx
@@ -9,7 +9,7 @@ export const Card = (props: BoxProps) => {
borderRadius=".5rem"
borderWidth="1px"
p={["0rem",".5rem","1rem"]}
- boxShadow="0 1px 2px 0 rgb(0 0 0 / 5%)"
+ boxShadow="0 1px 1px 0 rgb(0 0 0 / 5%)"
{...props}
/>
)
diff --git a/src/components/comments/comment.tsx b/src/components/comments/comment.tsx
new file mode 100644
index 00000000..f3d7c143
--- /dev/null
+++ b/src/components/comments/comment.tsx
@@ -0,0 +1,111 @@
+import React, { useState } from "react"
+import { Avatar, Divider, Flex, Heading, HStack, IconButton, Text, VStack, chakra, Menu, MenuButton, MenuList, MenuItem, Box } from "@chakra-ui/react"
+import { Comment } from "src/types/comments"
+import Card from "components/card"
+import { getUserName } from "utils/user"
+import moment from 'moment'
+import { MarkdownRender } from "components/markdown-editor/render"
+import HeartLike from "components/posts/heart-like"
+import { FaRegEdit, FaRegFlag, FaRegTrashAlt, FaReply, FaTrash } from "react-icons/fa"
+import { User } from "src/types/session"
+import CommentEditor from "./editor"
+import { requestApi } from "utils/axios/request"
+import Reply from "./reply"
+
+interface Props {
+ user: User
+ comment: Comment
+ onChange: any
+}
+export const CommentCard = (props: Props) => {
+ const { comment, user, onChange} = props
+ const [editorVisible, setEditorVisible] = useState(false)
+
+ const [replyVisible,setReplyVisible] = useState(false)
+ const [reply,setReply] = useState('')
+ const submitReply = async (md) => {
+ await requestApi.post('/story/comment',{targetID: comment.id, md: md})
+ setReplyVisible(false);
+ }
+
+ const changeComment = async (md) => {
+ await requestApi.post('/story/comment',{...comment, md})
+ setEditorVisible(false)
+ onChange()
+ }
+
+ const deleteComment = async id => {
+ await requestApi.delete(`/comment/${id}`)
+ onChange()
+ }
+
+ const likeComment = async (id) => {
+ await requestApi.post(`/story/like/${id}`)
+ onChange()
+ }
+
+ return (
+ <>{
+ editorVisible ? (user && {setEditorVisible(false);changeComment(md)}} onCancel={() => setEditorVisible(false)} />) :
+
+
+
+
+
+
+ {getUserName(comment.creator)}
+ about this user
+
+
+ {moment(comment.created).fromNow()}
+
+
+
+
+
+ likeComment(comment.id)} />
+
+ {user && }
+ onClick={() => setReplyVisible(!replyVisible)}
+ fontSize="20px"
+ />}
+
+
+
+
+
+ {replyVisible && {submitReply(md)}} onCancel={() => setReplyVisible(false)} />}
+
+ {comment.replies.map(reply =>
+
+
+
+ )}
+
+ }
+ >
+ )
+}
+
+export default CommentCard
diff --git a/src/components/comments/comments.tsx b/src/components/comments/comments.tsx
new file mode 100644
index 00000000..e4bb8290
--- /dev/null
+++ b/src/components/comments/comments.tsx
@@ -0,0 +1,42 @@
+import React, { useState } from "react"
+import {Text, Flex, HStack, Button, VStack } from "@chakra-ui/react"
+import Card from "components/card"
+import useSession from "hooks/use-session"
+import { requestApi } from "utils/axios/request"
+import CommentCard from "./comment"
+import CommentEditor from "./editor"
+
+interface Props {
+ storyID: string
+ comments: any[]
+ onChange: any
+}
+export const Comments = ({storyID, comments,onChange }: Props) => {
+ const [editorVisible,setEditorVisible] = useState(false)
+ const session = useSession()
+ const submitComment = async (md) => {
+ await requestApi.post('/story/comment',{targetID: storyID, md: md})
+ setEditorVisible(false)
+ onChange()
+ }
+
+ return (
+
+
+
+
+ Comments ({comments.length})
+
+
+
+
+
+
+ {editorVisible && session && submitComment(md)} onCancel={() => setEditorVisible(false)}/>}
+
+ {comments.map(comment => )}
+
+ )
+}
+
+export default Comments
diff --git a/src/components/comments/editor.tsx b/src/components/comments/editor.tsx
new file mode 100644
index 00000000..ea331ee2
--- /dev/null
+++ b/src/components/comments/editor.tsx
@@ -0,0 +1,45 @@
+import React, { useState } from "react"
+import { Box, Text, Flex, HStack, useColorModeValue, Button, VStack, Avatar, Heading, propNames } from "@chakra-ui/react"
+import Card from "components/card"
+import { MarkdownEditor } from "components/markdown-editor/editor"
+import useSession from "hooks/use-session"
+import { getUserName } from "utils/user"
+import EditModeSelect from "components/edit-mode-select"
+import { EditMode } from "src/types/editor"
+import { MarkdownRender } from "components/markdown-editor/render"
+import { Comment } from "src/types/comments"
+import { User } from "src/types/session"
+
+interface Props {
+ user: User
+ md: string
+ onSubmit: any
+ onCancel: any
+}
+
+export const CommentEditor = (props: Props) => {
+ const [editMode,setEditMode] = useState(EditMode.Edit)
+ const [md,setMd] = useState(props.md)
+
+ return (
+
+
+
+
+ {getUserName(props.user)}
+
+ setEditMode(m)}/>
+
+
+ {editMode===EditMode.Edit ? setMd(md)}/> : }
+
+
+
+
+
+
+
+ )
+}
+
+export default CommentEditor
diff --git a/src/components/comments/reply.tsx b/src/components/comments/reply.tsx
new file mode 100644
index 00000000..2f554524
--- /dev/null
+++ b/src/components/comments/reply.tsx
@@ -0,0 +1,105 @@
+import React, { useState } from "react"
+import { Avatar, Divider, Flex, Heading, HStack, IconButton, Text, VStack, chakra, Menu, MenuButton, MenuList, MenuItem, Box } from "@chakra-ui/react"
+import { Comment } from "src/types/comments"
+import Card from "components/card"
+import { getUserName } from "utils/user"
+import moment from 'moment'
+import { MarkdownRender } from "components/markdown-editor/render"
+import HeartLike from "components/posts/heart-like"
+import { FaRegEdit, FaRegFlag, FaRegTrashAlt, FaReply, FaTrash } from "react-icons/fa"
+import { User } from "src/types/session"
+import CommentEditor from "./editor"
+import { requestApi } from "utils/axios/request"
+
+interface Props {
+ user: User
+ comment: Comment
+ onChange: any
+}
+export const Reply = (props: Props) => {
+ const { comment, user,onChange} = props
+ const [editorVisible, setEditorVisible] = useState(false)
+
+ const [replyVisible,setReplyVisible] = useState(false)
+ const [reply,setReply] = useState('')
+ const submitReply = async (md) => {
+ await requestApi.post('/story/comment',{targetID: comment.id, md: md})
+ setReplyVisible(false);
+ }
+
+ const changeReply = async (md) => {
+ await requestApi.post('/story/comment',{...comment, md})
+ setEditorVisible(false)
+ onChange()
+ }
+
+ const deleteReply = async id => {
+ await requestApi.delete(`/comment/${id}`)
+ onChange()
+ }
+
+ const likeReply = async (id) => {
+ await requestApi.post(`/story/like/${id}`)
+ onChange()
+ }
+
+
+ return (
+ <>{
+ editorVisible ? (user && {setEditorVisible(false);changeReply(md)}} onCancel={() => setEditorVisible(false)} />) :
+
+
+
+
+
+ {getUserName(comment.creator)}
+
+
+ {moment(comment.created).fromNow()}
+
+
+
+
+
+ likeReply(comment.id)} />
+
+ {user && }
+ onClick={() => setReplyVisible(!replyVisible)}
+ fontSize="18px"
+ />}
+
+
+
+
+
+ {replyVisible &&
+
+ {submitReply(md)}} onCancel={() => setReplyVisible(false)} />
+ }
+ }
+ >
+ )
+}
+
+export default Reply
diff --git a/src/components/edit-mode-select.tsx b/src/components/edit-mode-select.tsx
new file mode 100644
index 00000000..3b8616b4
--- /dev/null
+++ b/src/components/edit-mode-select.tsx
@@ -0,0 +1,33 @@
+import React from "react"
+import { Box, BoxProps, HStack, useRadioGroup } from "@chakra-ui/react"
+import { EditMode } from "src/types/editor"
+import RadioCard from "./radio-card"
+
+interface Props {
+ onChange : any
+}
+export const EditModeSelect = (props: Props) => {
+ const editOptions = [EditMode.Edit, EditMode.Preview]
+ const { getRootProps, getRadioProps } = useRadioGroup({
+ name: "framework",
+ defaultValue: EditMode.Edit,
+ onChange: (v) => {
+ props.onChange(v)
+ },
+ })
+ const group = getRootProps()
+ return (
+
+ {editOptions.map((value) => {
+ const radio = getRadioProps({ value })
+ return (
+
+ {value}
+
+ )
+ })}
+
+ )
+}
+
+export default EditModeSelect
diff --git a/src/components/markdown-editor/render.tsx b/src/components/markdown-editor/render.tsx
index 71c3face..224c09b2 100644
--- a/src/components/markdown-editor/render.tsx
+++ b/src/components/markdown-editor/render.tsx
@@ -9,6 +9,7 @@ import WebsiteLink from 'components/website-link';
type Props = PropsOf & {
md: string
fontSize?: string
+ scroll?: boolean
}
const ChakraMarkdown = chakra(Markdown)
@@ -36,6 +37,7 @@ export function MarkdownRender({ md,fontSize, ...rest }:Props) {
},
},
}}
+ maxWidth={["800px","800px","800px","1000px"]}
>
);
diff --git a/src/components/posts/heart-like.tsx b/src/components/posts/heart-like.tsx
new file mode 100644
index 00000000..4f953d41
--- /dev/null
+++ b/src/components/posts/heart-like.tsx
@@ -0,0 +1,39 @@
+import { chakra, HStack, IconButton, Image, Tooltip, useColorMode, useColorModeValue } from "@chakra-ui/react";
+import { FaHeart, FaRegHeart } from "react-icons/fa";
+
+interface Props {
+ count: number
+ onClick: any
+ liked: boolean
+}
+const UnicornLike = (props: Props) => {
+ const label = "I like it"
+ return (
+
+
+ {props.liked? }
+ onClick={props.onClick}
+ fontSize="20px"
+ /> :
+ }
+ onClick={props.onClick}
+ fontSize="20px"
+ />}
+
+
+ {props.count}
+
+ )
+}
+
+export default UnicornLike
\ No newline at end of file
diff --git a/src/components/posts/tag-text-card.tsx b/src/components/posts/tag-text-card.tsx
index e69de29b..e07775c4 100644
--- a/src/components/posts/tag-text-card.tsx
+++ b/src/components/posts/tag-text-card.tsx
@@ -0,0 +1,21 @@
+import React from "react"
+import {Box, Heading, Image, Text, HStack,Button, Flex,PropsOf,Link} from "@chakra-ui/react"
+import { Tag } from "src/types/tag"
+import { ReserveUrls } from "src/data/reserve-urls"
+import NextLink from "next/link"
+import { useRouter } from "next/router"
+
+interface Props {
+ tag: Tag
+}
+
+
+export const TagTextCard = (props:Props) =>{
+ const {tag} = props
+ const router = useRouter()
+ return (
+
+ )
+}
+
+export default TagTextCard
diff --git a/src/components/posts/text-post-card.tsx b/src/components/posts/text-post-card.tsx
index ed4d8082..85ac2504 100644
--- a/src/components/posts/text-post-card.tsx
+++ b/src/components/posts/text-post-card.tsx
@@ -17,7 +17,7 @@ export const TextPostCard= (props:Props) =>{
const gap = moment(post.created).fromNow()
return (
-
+
{post.url ? 外部 : 原创}
{post.title}
diff --git a/src/components/like-button.tsx b/src/components/posts/unicorn-like.tsx
similarity index 56%
rename from src/components/like-button.tsx
rename to src/components/posts/unicorn-like.tsx
index b72c28d8..8240aff5 100644
--- a/src/components/like-button.tsx
+++ b/src/components/posts/unicorn-like.tsx
@@ -1,25 +1,13 @@
import { chakra, HStack, IconButton, Image, Tooltip, useColorMode, useColorModeValue } from "@chakra-ui/react";
interface Props {
- type: string
count: number
onClick: any
liked: boolean
}
-const LikeButton = (props: Props) => {
- let imgSrc: string
- let label: string
- switch (props.type) {
- case "like":
- imgSrc = "https://cdn.hashnode.com/res/hashnode/image/upload/v1594643814744/9iXxz71TL.png?auto=compress"
- label = "Love it"
- break;
- case "unicorn":
- imgSrc = "https://cdn.hashnode.com/res/hashnode/image/upload/v1594643772437/FYDU5k2kQ.png?auto=compress"
- label = "I love it"
- default:
- break;
- }
+const UnicornLike = (props: Props) => {
+ const imgSrc = "https://cdn.hashnode.com/res/hashnode/image/upload/v1594643772437/FYDU5k2kQ.png?auto=compress"
+ const label = "I love it"
return (
@@ -30,7 +18,7 @@ const LikeButton = (props: Props) => {
_focus={null}
icon={}
onClick={props.onClick}
- border={props.liked ? `1px solid ${useColorModeValue('gray','pink')}` : null}
+ border={props.liked ? `1px solid ${useColorModeValue('gray', 'pink')}` : null}
/>
{props.count}
@@ -38,4 +26,4 @@ const LikeButton = (props: Props) => {
)
}
-export default LikeButton
\ No newline at end of file
+export default UnicornLike
\ No newline at end of file
diff --git a/src/types/comments.ts b/src/types/comments.ts
new file mode 100644
index 00000000..737f938b
--- /dev/null
+++ b/src/types/comments.ts
@@ -0,0 +1,14 @@
+import { UserSimple } from "./session";
+
+export interface Comment {
+ id: string
+ targetID: string
+ creatorID: number
+ creator?: UserSimple
+ md: string
+ liked?: boolean
+ likes: number
+ replies: Comment[]
+ created?: string
+ updated?: string
+}
\ No newline at end of file
diff --git a/src/types/posts.ts b/src/types/posts.ts
index 96d6c110..faff5590 100644
--- a/src/types/posts.ts
+++ b/src/types/posts.ts
@@ -1,9 +1,10 @@
-import {User} from './session'
+import { UserSimple} from './session'
+import { Tag } from './tag';
export interface Post {
- id?: number
+ id?: string
slug?: string
- creator?: User
+ creator?: UserSimple
creatorId?: number
title?: string
md?: string
@@ -12,6 +13,7 @@ export interface Post {
brief?: string
created?: string
tags?: number[]
+ rawTags?: Tag[]
likes? : number
liked? : boolean
recommands? : number
diff --git a/src/types/session.ts b/src/types/session.ts
index 5a267f28..cd0a2d1c 100644
--- a/src/types/session.ts
+++ b/src/types/session.ts
@@ -13,4 +13,11 @@ export interface User {
email?: string
lastSeenAt?: string
created?: string
+}
+
+export interface UserSimple {
+ id :number
+ username: string
+ nickname: string
+ avatar: string
}
\ No newline at end of file
diff --git a/src/utils/user.ts b/src/utils/user.ts
new file mode 100644
index 00000000..640cf64d
--- /dev/null
+++ b/src/utils/user.ts
@@ -0,0 +1,4 @@
+import {User} from 'src/types/session'
+export function getUserName(user:User) {
+ return user.nickname === "" ? user.username : user.nickname
+}
\ No newline at end of file