"use strict";(self.webpackChunkthinkrchive_multiplatform=self.webpackChunkthinkrchive_multiplatform||[]).push([[335],{3905:function(t,e,a){a.d(e,{Zo:function(){return s},kt:function(){return u}});var r=a(7294);function n(t,e,a){return e in t?Object.defineProperty(t,e,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[e]=a,t}function i(t,e){var a=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),a.push.apply(a,r)}return a}function o(t){for(var e=1;e<arguments.length;e++){var a=null!=arguments[e]?arguments[e]:{};e%2?i(Object(a),!0).forEach((function(e){n(t,e,a[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(a)):i(Object(a)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(a,e))}))}return t}function l(t,e){if(null==t)return{};var a,r,n=function(t,e){if(null==t)return{};var a,r,n={},i=Object.keys(t);for(r=0;r<i.length;r++)a=i[r],e.indexOf(a)>=0||(n[a]=t[a]);return n}(t,e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);for(r=0;r<i.length;r++)a=i[r],e.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(n[a]=t[a])}return n}var p=r.createContext({}),m=function(t){var e=r.useContext(p),a=e;return t&&(a="function"==typeof t?t(e):o(o({},e),t)),a},s=function(t){var e=m(t.components);return r.createElement(p.Provider,{value:e},t.children)},h={inlineCode:"code",wrapper:function(t){var e=t.children;return r.createElement(r.Fragment,{},e)}},c=r.forwardRef((function(t,e){var a=t.components,n=t.mdxType,i=t.originalType,p=t.parentName,s=l(t,["components","mdxType","originalType","parentName"]),c=m(a),u=n,d=c["".concat(p,".").concat(u)]||c[u]||h[u]||i;return a?r.createElement(d,o(o({ref:e},s),{},{components:a})):r.createElement(d,o({ref:e},s))}));function u(t,e){var a=arguments,n=e&&e.mdxType;if("string"==typeof t||n){var i=a.length,o=new Array(i);o[0]=c;var l={};for(var p in e)hasOwnProperty.call(e,p)&&(l[p]=e[p]);l.originalType=t,l.mdxType="string"==typeof t?t:n,o[1]=l;for(var m=2;m<i;m++)o[m]=a[m];return r.createElement.apply(null,o)}return r.createElement.apply(null,a)}c.displayName="MDXCreateElement"},6719:function(t,e,a){a.r(e),a.d(e,{frontMatter:function(){return l},contentTitle:function(){return p},metadata:function(){return m},assets:function(){return s},toc:function(){return h},default:function(){return u}});var r=a(7462),n=a(3366),i=(a(7294),a(3905)),o=["components"],l={sidebar_position:1},p="Project Details",m={unversionedId:"overview/briefing",id:"overview/briefing",title:"Project Details",description:"Thinkrchive - Multiplatform is an Android & Desktop app that shows specifications and details of various Lenovo Thinkpad models. This project was made to try out Jetpack Compose and Kotlin Multiplatform so that I can see how I could adopt it to my own personal apps.",source:"@site/docs/overview/briefing.md",sourceDirName:"overview",slug:"/overview/briefing",permalink:"/Thinkrchive-Multiplatform/overview/briefing",editUrl:"https://github.com/Thinkrchive/Thinkrchive-Multiplatform-Docs/blob/main/docs/overview/briefing.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_position:1},sidebar:"tutorialSidebar",next:{title:"Setup",permalink:"/Thinkrchive-Multiplatform/overview/runnning"}},s={},h=[{value:"\ud83e\udd33 Screenshots",id:"-screenshots",level:2},{value:"\ud83c\udfcb Tools",id:"-tools",level:2},{value:"\ud83c\udfd7\ufe0f\ufe0f Built with",id:"\ufe0f\ufe0f-built-with",level:2},{value:"\ud83e\uddd0 Fun Facts",id:"-fun-facts",level:2},{value:"\u2705 TODO",id:"-todo",level:2},{value:"\ud83d\ude47 Credits",id:"-credits",level:2},{value:"\ud83e\udd1d Contributing",id:"-contributing",level:2},{value:"\u2764 Show your support",id:"-show-your-support",level:2},{value:"\ud83d\udcdd License",id:"-license",level:2}],c={toc:h};function u(t){var e=t.components,a=(0,n.Z)(t,o);return(0,i.kt)("wrapper",(0,r.Z)({},c,a,{components:e,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"project-details"},"Project Details"),(0,i.kt)("p",null,"Thinkrchive - Multiplatform is an Android & Desktop app that shows specifications and details of various Lenovo Thinkpad models. This project was made to try out Jetpack Compose and Kotlin Multiplatform so that I can see how I could adopt it to my own personal apps."),(0,i.kt)("p",null,"This app will also be documented heavily so that it can help anyone else in the future that is trying to get into Kotlin Multiplatform to support Android and Desktop via ",(0,i.kt)("a",{parentName:"p",href:"https://www.jetbrains.com/lp/compose-mpp/"},"Compose Multiplatform")),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"This project is a Mutliplatform version of the initial ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/racka98/ThinkRchive"},"Thinkrchive")," which was Android only")),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Light"),(0,i.kt)("th",{parentName:"tr",align:null},"Dark"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("img",{parentName:"td",src:"https://i.imgur.com/DX6DhQP.png",alt:"Screenshot"})),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("img",{parentName:"td",src:"https://i.imgur.com/XAm5ld0.png",alt:"Screenshot"}))))),(0,i.kt)("h2",{id:"-screenshots"},"\ud83e\udd33 Screenshots"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},(0,i.kt)("img",{parentName:"th",src:"https://i.imgur.com/DX6DhQP.png",alt:"Screenshot"})),(0,i.kt)("th",{parentName:"tr",align:null},(0,i.kt)("img",{parentName:"th",src:"https://i.imgur.com/XAm5ld0.png",alt:"Screenshot"})),(0,i.kt)("th",{parentName:"tr",align:null},(0,i.kt)("img",{parentName:"th",src:"https://i.imgur.com/Q8muSdP.png",alt:"Screenshot"})))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("img",{parentName:"td",src:"https://i.imgur.com/jg1VClv.png",alt:"Screenshot"})),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("img",{parentName:"td",src:"https://i.imgur.com/llz2peN.png",alt:"Screenshot"})),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("img",{parentName:"td",src:"https://i.imgur.com/RRsKGOG.png",alt:"Screenshot"}))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("img",{parentName:"td",src:"https://i.imgur.com/2yVTC6l.png",alt:"Screenshot"})),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("img",{parentName:"td",src:"https://i.imgur.com/6MDKZYj.png",alt:"Screenshot"})),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("img",{parentName:"td",src:"https://i.imgur.com/4aYBsCi.png",alt:"Screenshot"}))))),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://"},"More Coming Soon"))),(0,i.kt)("h2",{id:"-tools"},"\ud83c\udfcb Tools"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Java 11 or above"),(0,i.kt)("li",{parentName:"ul"},"Android Studio Bumblebee | 2021.1+")),(0,i.kt)("h2",{id:"\ufe0f\ufe0f-built-with"},"\ud83c\udfd7\ufe0f\ufe0f Built with"),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},(0,i.kt)("em",{parentName:"strong"},"Compared to ",(0,i.kt)("a",{parentName:"em",href:"https://github.com/racka98/ThinkRchive"},"Thinkrchive")," which was Android only"))),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Component"),(0,i.kt)("th",{parentName:"tr",align:null},"Thinkrchive"),(0,i.kt)("th",{parentName:"tr",align:null},"Thinkrchive-Multiplaform"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"\ud83c\udfad  User Interface"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://developer.android.com/jetpack/compose"},"Jetpack Compose")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://www.jetbrains.com/lp/compose-mpp/"},"Compose Mulitplatform"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"\ud83c\udfd7  Architecture"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93viewmodel"},"MVVM")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/MostafaBorjali/MVI-Architecture/wiki/MVI-Architecture-Wiki"},"MVI")," - ",(0,i.kt)("a",{parentName:"td",href:"https://orbit-mvi.org/"},"Orbit MVI"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"\ud83e\udde0  Backend"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/racka98/Thinkrchive-Server"},"Thinkrchive Ktor Server")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/racka98/Thinkrchive-Server"},"Thinkrchive Ktor Server"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"\ud83d\udc89  DI"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://dagger.dev/hilt/"},"Hilt")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://insert-koin.io/"},"Koin"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"\ud83d\udee3\ufe0f  Navigation"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://developer.android.com/jetpack/compose/navigation"},"Compose Navigation")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://developer.android.com/jetpack/compose/navigation"},"Compose Navigation"),", ",(0,i.kt)("a",{parentName:"td",href:"https://arkivanov.github.io/Decompose/"},"Decompose"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"\ud83c\udf0a  Async"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://kotlinlang.org/docs/coroutines-overview.html"},"Coroutines")," + ",(0,i.kt)("a",{parentName:"td",href:"https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/"},"Flow + StateFlow + SharedFlow")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://kotlinlang.org/docs/coroutines-overview.html"},"Coroutines")," + ",(0,i.kt)("a",{parentName:"td",href:"https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/"},"Flow + StateFlow + SharedFlow"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"\ud83c\udf10  Networking"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://ktor.io/docs/client.html"},"Ktor Client")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://ktor.io/docs/client.html"},"Ktor Client"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"\ud83d\udcc4  JSON"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/Kotlin/kotlinx.serialization"},"Kotlin Serialization")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/Kotlin/kotlinx.serialization"},"Kotlin Serialization"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"\ud83d\udcbe  Persistance"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://developer.android.com/training/data-storage/room"},"Room")," + ",(0,i.kt)("a",{parentName:"td",href:"https://developer.android.com/topic/libraries/architecture/datastore"},"Preference DataStore")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://cashapp.github.io/sqldelight/"},"SQLDelight"),", ",(0,i.kt)("a",{parentName:"td",href:"https://github.com/russhwolf/multiplatform-settings"},"Multiplatform Settings"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"\u2328\ufe0f  Logging"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/JakeWharton/timber"},"Timber")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/JakeWharton/timber"},"Timber")," - Android, ",(0,i.kt)("a",{parentName:"td",href:"https://www.baeldung.com/kotlin/logging"},"slf4j + logback"),", ",(0,i.kt)("a",{parentName:"td",href:"https://github.com/touchlab/Kermit"},"Kermit"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"\ud83d\udcf8  Image Loading"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://coil-kt.github.io/coil/"},"Coil")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://coil-kt.github.io/coil/"},"Coil"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"\ud83d\udd27  Supplimentary"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/google/accompanist"},"Accompanist")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/google/accompanist"},"Accompanist"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"\ud83e\uddea  Testing"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://site.mockito.org/"},"Mockito")," + ",(0,i.kt)("a",{parentName:"td",href:"https://github.com/junit-team/junit5"},"JUnit")," + ",(0,i.kt)("a",{parentName:"td",href:"https://github.com/robolectric/robolectric"},"Robolectric")),(0,i.kt)("td",{parentName:"tr",align:null},"Not Setup Yet")))),(0,i.kt)("h2",{id:"-fun-facts"},"\ud83e\uddd0 Fun Facts"),(0,i.kt)("div",{className:"admonition admonition-tip alert alert--success"},(0,i.kt)("div",{parentName:"div",className:"admonition-heading"},(0,i.kt)("h5",{parentName:"div"},(0,i.kt)("span",{parentName:"h5",className:"admonition-icon"},(0,i.kt)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"12",height:"16",viewBox:"0 0 12 16"},(0,i.kt)("path",{parentName:"svg",fillRule:"evenodd",d:"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"}))),"Fun little facts")),(0,i.kt)("div",{parentName:"div",className:"admonition-content"},(0,i.kt)("ul",{parentName:"div"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"ThinkRchive\noriginally used ",(0,i.kt)("a",{parentName:"p",href:"https://docs.google.com/spreadsheets/d/1cFrYzzAP7i3bzSLKuBMykz3ZNUbf-YPTqRSEAwINy_E/edit?usp=sharing"},"a google sheet"),"\nas the backend via ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/theapache64/retrosheet"},"Retrosheet"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"ThinkRchive now uses ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/racka98/Thinkrchive-Server"},"a custom Ktor powered server client")," as the backend. The backend is hosted on ",(0,i.kt)("a",{parentName:"p",href:"https://www.heroku.com"},"Heroku"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"I mocked the designs for this app on Figma and the finished app looks better than my initial designs"))))),(0,i.kt)("h2",{id:"-todo"},"\u2705 TODO"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Add more Tests (Unit Tests, UI Tests, Integration Tests)"),(0,i.kt)("li",{parentName:"ul"},"Add more features"),(0,i.kt)("li",{parentName:"ul"},"Support for more platforms")),(0,i.kt)("h2",{id:"-credits"},"\ud83d\ude47 Credits"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Special thanks to ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/theapache64"},"@theapache64")," for ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/theapache64/readgen"},"readgen")),(0,i.kt)("li",{parentName:"ul"},"All the maintainers of the 3rd party libraries used in this project."),(0,i.kt)("li",{parentName:"ul"},"Thanks to all amazing people at Twitter for inspiring me to continue the development of this project.")),(0,i.kt)("h2",{id:"-contributing"},"\ud83e\udd1d Contributing"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"See ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/racka98/Thinkrchive-Multiplatform/blob/main/CONTRIBUTING.md"},"CONTRIBUTING"))),(0,i.kt)("h2",{id:"-show-your-support"},"\u2764 Show your support"),(0,i.kt)("p",null,"Give a \u2b50\ufe0f if this project helped you!"),(0,i.kt)("p",null,(0,i.kt)("a",{parentName:"p",href:"https://ko-fi.com/U6U44Y0MQ"},(0,i.kt)("img",{parentName:"a",src:"https://ko-fi.com/img/githubbutton_sm.svg",alt:"ko-fi"}))),(0,i.kt)("h2",{id:"-license"},"\ud83d\udcdd License"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/racka98/Thinkrchive-Multiplatform/blob/main/LICENSE"},"Full License"))),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-md"},"    ThinkRhcive - An app showing all details for various Lenovo Thinkpad models.\n    Copyright (C) 2021  racka98\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n")),(0,i.kt)("p",null,(0,i.kt)("em",{parentName:"p"},(0,i.kt)("strong",{parentName:"em"},"Made With \u2764 From Tanzania \ud83c\uddf9\ud83c\uddff"))))}u.isMDXComponent=!0}}]);