├── .gitignore ├── GhostUI ├── ClientApp │ ├── package.json │ ├── public │ │ ├── favicon.ico │ │ ├── index.html │ │ ├── logo192.png │ │ ├── logo512.png │ │ ├── manifest.json │ │ └── robots.txt │ ├── src │ │ ├── App.tsx │ │ ├── Layout.tsx │ │ ├── api │ │ │ ├── auth.service.ts │ │ │ ├── base.service.ts │ │ │ ├── index.ts │ │ │ ├── sample.service.ts │ │ │ └── signalr.service.ts │ │ ├── assets │ │ │ ├── image │ │ │ │ ├── BulmaLogo.svg │ │ │ │ ├── ReactCore.svg │ │ │ │ └── based-ghost-main.png │ │ │ └── style │ │ │ │ └── scss │ │ │ │ ├── base │ │ │ │ ├── generic.scss │ │ │ │ ├── transition.scss │ │ │ │ └── variables.scss │ │ │ │ ├── components │ │ │ │ ├── navbar.scss │ │ │ │ └── tool-tip.scss │ │ │ │ └── site.scss │ │ ├── components │ │ │ ├── Authenticator.tsx │ │ │ ├── Checkbox.tsx │ │ │ ├── Footer.tsx │ │ │ ├── Navbar.tsx │ │ │ ├── Settings.tsx │ │ │ ├── Spinner.tsx │ │ │ └── index.ts │ │ ├── config │ │ │ ├── constants.ts │ │ │ ├── fa.config.ts │ │ │ ├── index.ts │ │ │ ├── routes.config.ts │ │ │ └── toastify.config.ts │ │ ├── containers │ │ │ ├── Dashboard │ │ │ │ └── index.tsx │ │ │ ├── FetchData │ │ │ │ ├── ForecastTable.tsx │ │ │ │ ├── Pagination.tsx │ │ │ │ └── index.tsx │ │ │ ├── Form │ │ │ │ ├── CheckboxFormGroup.tsx │ │ │ │ ├── CounterFormGroup.tsx │ │ │ │ ├── SelectFormGroup.tsx │ │ │ │ └── index.tsx │ │ │ ├── Login │ │ │ │ ├── LoginControls.tsx │ │ │ │ ├── PasswordInput.tsx │ │ │ │ ├── UserNameInput.tsx │ │ │ │ └── index.tsx │ │ │ └── index.ts │ │ ├── hooks │ │ │ ├── index.ts │ │ │ ├── useCSSTransitionProps.ts │ │ │ ├── useIsLoggedIn.ts │ │ │ ├── useOnClickOutside.ts │ │ │ └── useTextInput.ts │ │ ├── index.tsx │ │ ├── react-app-env.d.ts │ │ ├── reportWebVitals.ts │ │ ├── service-worker.ts │ │ ├── serviceWorkerRegistration.ts │ │ ├── store │ │ │ ├── authSlice.ts │ │ │ ├── configureStore.ts │ │ │ ├── formSlice.ts │ │ │ ├── hooks.ts │ │ │ ├── index.ts │ │ │ └── weatherSlice.ts │ │ └── utils │ │ │ ├── classNames.ts │ │ │ ├── index.ts │ │ │ └── isArrayWithLength.ts │ └── tsconfig.json ├── Controllers │ ├── AuthController.cs │ └── SampleDataController.cs ├── Extensions │ ├── ExceptionHandlerExtensions.cs │ ├── HealthCheckBuilderExtensions.cs │ └── ServiceCollectionExtensions.cs ├── GhostUI.csproj ├── HealthChecks │ └── GCInfo │ │ ├── GCInfoHealthCheck.cs │ │ ├── GCInfoOptions.cs │ │ └── IGCInfoOptions.cs ├── Hubs │ ├── IUsersHub.cs │ └── UsersHub.cs ├── Models │ ├── AuthUser.cs │ ├── Credentials.cs │ ├── ExceptionDetails.cs │ ├── IAuthUser.cs │ ├── ICredentials.cs │ ├── IWeatherForecast.cs │ └── WeatherForecast.cs ├── Pages │ ├── Error.cshtml │ ├── Error.cshtml.cs │ └── _ViewImports.cshtml ├── Program.cs ├── Properties │ └── launchSettings.json ├── appsettings.Development.json ├── appsettings.json ├── nswag.json └── openapi.json ├── LICENSE ├── README.md ├── demo └── react_dot_net_52530-2021.gif └── solution.sln /.gitignore: -------------------------------------------------------------------------------- 1 | # Editor directories and files 2 | .idea 3 | *.suo 4 | *.user 5 | *.userosscache 6 | *.sln 7 | *.sln.docstates 8 | *.ntvs* 9 | *.njsproj 10 | .vscode 11 | 12 | # File generated by NuGet package AspNetCore.HealthChecks.UI 13 | healthchecksdb 14 | 15 | # User-specific files (MonoDevelop/Xamarin Studio) 16 | *.userprefs 17 | 18 | # Build results 19 | [Dd]ebug/ 20 | [Dd]ebugPublic/ 21 | [Rr]elease/ 22 | [Rr]eleases/ 23 | x64/ 24 | x86/ 25 | bld/ 26 | [Bb]in/ 27 | [Oo]bj/ 28 | [Ll]og/ 29 | 30 | # Visual Studio 2015 cache/options directory 31 | .vs/ 32 | /wwwroot/dist/ 33 | /ClientApp/dist/ 34 | /GhostUI/wwwroot/dist 35 | /GhostUI/ClientApp/dist 36 | 37 | # MSTest test Results 38 | [Tt]est[Rr]esult*/ 39 | [Bb]uild[Ll]og.* 40 | 41 | # NUNIT 42 | *.VisualState.xml 43 | TestResult.xml 44 | 45 | # Build Results of an ATL Project 46 | [Dd]ebugPS/ 47 | [Rr]eleasePS/ 48 | dlldata.c 49 | 50 | # DNX 51 | project.lock.json 52 | project.fragment.lock.json 53 | artifacts/ 54 | 55 | *_i.c 56 | *_p.c 57 | *_i.h 58 | *.ilk 59 | *.meta 60 | *.obj 61 | *.pch 62 | *.pdb 63 | *.pgc 64 | *.pgd 65 | *.rsp 66 | *.sbr 67 | *.tlb 68 | *.tli 69 | *.tlh 70 | *.tmp 71 | *.tmp_proj 72 | *.log 73 | *.vspscc 74 | *.vssscc 75 | .builds 76 | *.pidb 77 | *.svclog 78 | *.scc 79 | 80 | # Chutzpah Test files 81 | _Chutzpah* 82 | 83 | # Visual C++ cache files 84 | ipch/ 85 | *.aps 86 | *.ncb 87 | *.opendb 88 | *.opensdf 89 | *.sdf 90 | *.cachefile 91 | *.VC.db 92 | *.VC.VC.opendb 93 | 94 | # Visual Studio profiler 95 | *.psess 96 | *.vsp 97 | *.vspx 98 | *.sap 99 | 100 | # TFS 2012 Local Workspace 101 | $tf/ 102 | 103 | # Guidance Automation Toolkit 104 | *.gpState 105 | 106 | # ReSharper is a .NET coding add-in 107 | _ReSharper*/ 108 | *.[Rr]e[Ss]harper 109 | *.DotSettings.user 110 | 111 | # JustCode is a .NET coding add-in 112 | .JustCode 113 | 114 | # TeamCity is a build add-in 115 | _TeamCity* 116 | 117 | # DotCover is a Code Coverage Tool 118 | *.dotCover 119 | 120 | # NCrunch 121 | _NCrunch_* 122 | .*crunch*.local.xml 123 | nCrunchTemp_* 124 | 125 | # MightyMoose 126 | *.mm.* 127 | AutoTest.Net/ 128 | 129 | # Web workbench (sass) 130 | .sass-cache/ 131 | 132 | # Installshield output folder 133 | [Ee]xpress/ 134 | 135 | # DocProject is a documentation generator add-in 136 | DocProject/buildhelp/ 137 | DocProject/Help/*.HxT 138 | DocProject/Help/*.HxC 139 | DocProject/Help/*.hhc 140 | DocProject/Help/*.hhk 141 | DocProject/Help/*.hhp 142 | DocProject/Help/Html2 143 | DocProject/Help/html 144 | 145 | # Click-Once directory 146 | publish/ 147 | 148 | # Publish Web Output 149 | *.[Pp]ublish.xml 150 | *.azurePubxml 151 | # TODO: Comment the next line if you want to checkin your web deploy settings 152 | # but database connection strings (with potential passwords) will be unencrypted 153 | #*.pubxml 154 | *.publishproj 155 | 156 | # Microsoft Azure Web App publish settings. Comment the next line if you want to 157 | # checkin your Azure Web App publish settings, but sensitive information contained 158 | # in these scripts will be unencrypted 159 | PublishScripts/ 160 | 161 | # NuGet Packages 162 | *.nupkg 163 | # The packages folder can be ignored because of Package Restore 164 | **/packages/* 165 | # except build/, which is used as an MSBuild target. 166 | !**/packages/build/ 167 | # Uncomment if necessary however generally it will be regenerated when needed 168 | #!**/packages/repositories.config 169 | # NuGet v3's project.json files produces more ignoreable files 170 | *.nuget.props 171 | *.nuget.targets 172 | 173 | # Microsoft Azure Build Output 174 | csx/ 175 | *.build.csdef 176 | 177 | # Microsoft Azure Emulator 178 | ecf/ 179 | rcf/ 180 | 181 | # Windows Store app package directories and files 182 | AppPackages/ 183 | BundleArtifacts/ 184 | Package.StoreAssociation.xml 185 | _pkginfo.txt 186 | 187 | # Visual Studio cache files 188 | # files ending in .cache can be ignored 189 | *.[Cc]ache 190 | # but keep track of directories ending in .cache 191 | !*.[Cc]ache/ 192 | 193 | # Others 194 | ClientBin/ 195 | ~$* 196 | *~ 197 | *.dbmdl 198 | *.dbproj.schemaview 199 | *.jfm 200 | *.pfx 201 | *.publishsettings 202 | node_modules/ 203 | orleans.codegen.cs 204 | .DS_Store 205 | package-lock.json 206 | 207 | # Since there are multiple workflows, uncomment next line to ignore bower_components 208 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 209 | #bower_components/ 210 | 211 | # RIA/Silverlight projects 212 | Generated_Code/ 213 | 214 | # Backup & report files from converting an old project file 215 | # to a newer Visual Studio version. Backup files are not needed, 216 | # because we have git ;-) 217 | _UpgradeReport_Files/ 218 | Backup*/ 219 | UpgradeLog*.XML 220 | UpgradeLog*.htm 221 | 222 | # SQL Server files 223 | *.mdf 224 | *.ldf 225 | 226 | # Business Intelligence projects 227 | *.rdl.data 228 | *.bim.layout 229 | *.bim_*.settings 230 | 231 | # Microsoft Fakes 232 | FakesAssemblies/ 233 | 234 | # GhostDoc plugin setting file 235 | *.GhostDoc.xml 236 | 237 | # Node.js Tools for Visual Studio 238 | .ntvs_analysis.dat 239 | 240 | # Visual Studio 6 build log 241 | *.plg 242 | 243 | # Visual Studio 6 workspace options file 244 | *.opt 245 | 246 | # Visual Studio LightSwitch build output 247 | **/*.HTMLClient/GeneratedArtifacts 248 | **/*.DesktopClient/GeneratedArtifacts 249 | **/*.DesktopClient/ModelManifest.xml 250 | **/*.Server/GeneratedArtifacts 251 | **/*.Server/ModelManifest.xml 252 | _Pvt_Extensions 253 | 254 | # Paket dependency manager 255 | .paket/paket.exe 256 | paket-files/ 257 | 258 | # FAKE - F# Make 259 | .fake/ 260 | 261 | # JetBrains Rider 262 | .idea/ 263 | *.sln.iml 264 | 265 | # CodeRush 266 | .cr/ 267 | 268 | # Python Tools for Visual Studio (PTVS) 269 | __pycache__/ 270 | *.pyc 271 | -------------------------------------------------------------------------------- /GhostUI/ClientApp/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "aspnet-core-react-redux-playground-template", 3 | "version": "0.1.0", 4 | "private": true, 5 | "dependencies": { 6 | "@fortawesome/fontawesome-svg-core": "^6.3.0", 7 | "@fortawesome/free-brands-svg-icons": "^6.3.0", 8 | "@fortawesome/free-solid-svg-icons": "^6.3.0", 9 | "@fortawesome/react-fontawesome": "^0.2.0", 10 | "@microsoft/signalr": "^7.0.4", 11 | "@reduxjs/toolkit": "^1.9.3", 12 | "axios": "^1.3.4", 13 | "bulma": "^0.9.4", 14 | "history": "^5.3.0", 15 | "react": "^18.2.0", 16 | "react-dom": "^18.2.0", 17 | "react-functional-select": "^5.0.0", 18 | "react-redux": "^8.0.5", 19 | "react-router-dom": "^6.9.0", 20 | "react-scripts": "^5.0.1", 21 | "react-toastify": "^9.1.2", 22 | "react-transition-group": "^4.4.5", 23 | "react-window": "^1.8.8", 24 | "redux": "^4.2.1", 25 | "styled-components": "^5.3.9", 26 | "web-vitals": "^3.3.0", 27 | "workbox-background-sync": "^6.5.4", 28 | "workbox-broadcast-update": "^6.5.4", 29 | "workbox-cacheable-response": "^6.5.4", 30 | "workbox-core": "^6.5.4", 31 | "workbox-expiration": "^6.5.4", 32 | "workbox-google-analytics": "^6.5.4", 33 | "workbox-navigation-preload": "^6.5.4", 34 | "workbox-precaching": "^6.5.4", 35 | "workbox-range-requests": "^6.5.4", 36 | "workbox-routing": "^6.5.4", 37 | "workbox-strategies": "^6.5.4", 38 | "workbox-streams": "^6.5.4" 39 | }, 40 | "scripts": { 41 | "start": "react-scripts start", 42 | "build": "react-scripts build", 43 | "test": "react-scripts test", 44 | "eject": "react-scripts eject" 45 | }, 46 | "eslintConfig": { 47 | "extends": "react-app" 48 | }, 49 | "browserslist": { 50 | "production": [ 51 | ">0.2%", 52 | "not dead", 53 | "not IE 11", 54 | "not op_mini all" 55 | ], 56 | "development": [ 57 | "last 1 chrome version", 58 | "last 1 firefox version", 59 | "last 1 safari version" 60 | ] 61 | }, 62 | "devDependencies": { 63 | "@types/history": "^4.7.11", 64 | "@types/jest": "^29.5.0", 65 | "@types/node": "^18.15.8", 66 | "@types/react": "^18.0.29", 67 | "@types/react-dom": "^18.0.11", 68 | "@types/react-router": "^5.1.20", 69 | "@types/react-router-dom": "^5.3.3", 70 | "@types/react-transition-group": "^4.4.5", 71 | "@types/styled-components": "^5.1.26", 72 | "@types/webpack-env": "^1.18.0", 73 | "sass": "^1.60.0", 74 | "typescript": "^5.0.2" 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /GhostUI/ClientApp/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/based-ghost/aspnet-core-react-redux-playground-template/443cfc3188dedcd7701d6c66d4b91df20359b487/GhostUI/ClientApp/public/favicon.ico -------------------------------------------------------------------------------- /GhostUI/ClientApp/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 14 | 15 | 24 | GhostUI 25 | 26 | 27 | 28 |
29 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /GhostUI/ClientApp/public/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/based-ghost/aspnet-core-react-redux-playground-template/443cfc3188dedcd7701d6c66d4b91df20359b487/GhostUI/ClientApp/public/logo192.png -------------------------------------------------------------------------------- /GhostUI/ClientApp/public/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/based-ghost/aspnet-core-react-redux-playground-template/443cfc3188dedcd7701d6c66d4b91df20359b487/GhostUI/ClientApp/public/logo512.png -------------------------------------------------------------------------------- /GhostUI/ClientApp/public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "aspnet-core-react-redux-playground-template", 3 | "short_name": "aspnet-core-react-template", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | }, 10 | { 11 | "src": "logo192.png", 12 | "type": "image/png", 13 | "sizes": "192x192" 14 | }, 15 | { 16 | "src": "logo512.png", 17 | "type": "image/png", 18 | "sizes": "512x512" 19 | } 20 | ], 21 | "start_url": ".", 22 | "display": "standalone", 23 | "background_color": "#000000", 24 | "theme_color": "#209cee" 25 | } 26 | -------------------------------------------------------------------------------- /GhostUI/ClientApp/public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | -------------------------------------------------------------------------------- /GhostUI/ClientApp/src/App.tsx: -------------------------------------------------------------------------------- 1 | import Layout from './Layout'; 2 | import { Routes as routes } from './config'; 3 | import type { FunctionComponent } from 'react'; 4 | import { useCSSTransitionProps } from './hooks'; 5 | import { useLocation, Route, Routes } from 'react-router-dom'; 6 | import { CSSTransition, SwitchTransition } from 'react-transition-group'; 7 | 8 | const App: FunctionComponent = () => { 9 | const location = useLocation(); 10 | const cssProps = useCSSTransitionProps(); 11 | 12 | return ( 13 | 14 | 15 | 16 | 17 | {routes.map(({ path, Component }) => ( 18 | } 22 | /> 23 | ))} 24 | 25 | 26 | 27 | 28 | ); 29 | }; 30 | 31 | export default App; -------------------------------------------------------------------------------- /GhostUI/ClientApp/src/Layout.tsx: -------------------------------------------------------------------------------- 1 | import { Footer, Navbar, Settings } from './components'; 2 | import { Fragment, type FunctionComponent, type PropsWithChildren } from 'react'; 3 | 4 | const Layout: FunctionComponent = ({ children }) => ( 5 | 6 | 7 | 8 | {children} 9 |