<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Tom Fong</title>
    <description>The latest articles on DEV Community by Tom Fong (@tomfong).</description>
    <link>https://dev.to/tomfong</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F872271%2Fae6e2329-93f7-4887-8803-c51f3f6d9087.png</url>
      <title>DEV Community: Tom Fong</title>
      <link>https://dev.to/tomfong</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tomfong"/>
    <language>en</language>
    <item>
      <title>Ionic Angular: Project Structure Suggestion</title>
      <dc:creator>Tom Fong</dc:creator>
      <pubDate>Mon, 06 Jun 2022 06:13:49 +0000</pubDate>
      <link>https://dev.to/tomfong/ionic-angular-project-structure-suggestion-2f9</link>
      <guid>https://dev.to/tomfong/ionic-angular-project-structure-suggestion-2f9</guid>
      <description>&lt;p&gt;I would like to share how I manage Ionic Angular project generally.&lt;/p&gt;

&lt;p&gt;By using &lt;code&gt;ionic generate&lt;/code&gt; command, we can get what Angular features are available in an Ionic Angular project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; page 
  component 
  service 
  module 
  class 
  directive 
  guard 
  class 
  directive 
  guard 
  pipe 
  interface 
  enum 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I usually divide and group them according to their type (component, service, guard etc.) rather than use case. It can make the project structure cleaner and simplify the syntax of importing exported declarations or modules.&lt;/p&gt;

&lt;p&gt;Here is an example of the structure I usually apply&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;src
├── app
    ├── components
        └── search
            ├── search.component.html
            ├── search.component.scss
            └── search.component.ts
    ├── directives
        ├── disable-click.directive.ts
        └── highlight.directive.ts
    ├── enums
        ├── colors.ts
        └── genders.ts
    ├── guards
        └── auth.guard.ts
    ├── modals
        └── student-info
            ├── student-info.module.ts
            ├── student-info.page.html
            ├── student-info.page.scss
            └── student-info.page.ts
    ├── models
        └── student.ts
    ├── pages
        └── home
            ├── home-routing.module.ts
            ├── home.module.ts
            ├── home.page.html
            ├── home.page.scss
            └── home.page.ts
        └── login
            ├── login-routing.module.ts
            ├── login.module.ts
            ├── login.page.html
            ├── login.page.scss
            └── login.page.ts
    ├── pipes
        └── date.pipe.ts
    ├── services
        ├── auth.service.ts
        └── env.service.ts
    ├── utils
        ├── animations.ts
        └── validators.ts
├── assets
├── environments
├── theme
├── global.scss
├── index.html
├── main.ts
├── polyfills.ts
├── test.ts
└── zone-flags.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Key Points
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;components&lt;/code&gt;: This folder consists of all non-page components that is without module.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;directives&lt;/code&gt;: This folder consists of all Angular directives.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;enums&lt;/code&gt;: This folder consists of all enums.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;guards&lt;/code&gt;: This folder consists of all Angular guards.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;modals&lt;/code&gt;: This folder consists of all page components that is not used for routing but for Ionic modal.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;models&lt;/code&gt;: This folder consists of all classes that is used to represent MVC's model or so-called DTO (Data Transfer Object).&lt;/p&gt;

&lt;p&gt;&lt;code&gt;pages&lt;/code&gt;: This folder consists of all page components that should be used for routing.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;pipes&lt;/code&gt;: This folder consists of all Angular pipes.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;services&lt;/code&gt;: This folder consists of all Angular injectable services.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;utils&lt;/code&gt;: This folder consists of all helper classes or functions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example
&lt;/h2&gt;

&lt;p&gt;I did not create an example project to demonstrate this structure, but you can take my Ionic app - &lt;a href="https://github.com/tomfong/simple-qr"&gt;Simple QR&lt;/a&gt; as a real-world reference.&lt;/p&gt;

&lt;p&gt;Hope this can help you. Happy coding!&lt;/p&gt;

</description>
      <category>angular</category>
      <category>ionic</category>
      <category>beginners</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Simple QR - open-source app to scan, create and store QR codes</title>
      <dc:creator>Tom Fong</dc:creator>
      <pubDate>Sat, 04 Jun 2022 16:14:50 +0000</pubDate>
      <link>https://dev.to/tomfong/simple-qr-open-source-app-to-scan-create-and-store-qr-codes-3mfk</link>
      <guid>https://dev.to/tomfong/simple-qr-open-source-app-to-scan-create-and-store-qr-codes-3mfk</guid>
      <description>&lt;p&gt;I've been developing an open-source app called &lt;strong&gt;Simple QR&lt;/strong&gt; that provides a simple UI and experience to scan, create and store QR codes. Here is the source code:&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--566lAguM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/tomfong"&gt;
        tomfong
      &lt;/a&gt; / &lt;a href="https://github.com/tomfong/simple-qr"&gt;
        simple-qr
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Simple and lightweight app to scan, create and store QR codes.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;h1&gt;
Simple QR&lt;/h1&gt;
&lt;p&gt;&lt;br&gt;&lt;a rel="noopener noreferrer" href="https://raw.githubusercontent.com/tomfong/simple-qr/main/.github/images/icon_round.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--681qDWXA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/tomfong/simple-qr/main/.github/images/icon_round.png" width="100" height="100"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
  &lt;strong&gt;
    Simple QR
  &lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;
  Simple and lightweight app to scan, create and store QR codes
&lt;/p&gt;



&lt;p&gt;
  &lt;a rel="noopener noreferrer" href="https://raw.githubusercontent.com/tomfong/simple-qr/main/.github/images/screenshot_1.png"&gt;&lt;img height="300" src="https://res.cloudinary.com/practicaldev/image/fetch/s--LQ78fqxy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/tomfong/simple-qr/main/.github/images/screenshot_1.png"&gt;&lt;/a&gt;
  &lt;a rel="noopener noreferrer" href="https://raw.githubusercontent.com/tomfong/simple-qr/main/.github/images/screenshot_2.png"&gt;&lt;img height="300" src="https://res.cloudinary.com/practicaldev/image/fetch/s--xHBjEg0h--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/tomfong/simple-qr/main/.github/images/screenshot_2.png"&gt;&lt;/a&gt;
  &lt;a rel="noopener noreferrer" href="https://raw.githubusercontent.com/tomfong/simple-qr/main/.github/images/screenshot_3.png"&gt;&lt;img height="300" src="https://res.cloudinary.com/practicaldev/image/fetch/s--ndl9jaeq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/tomfong/simple-qr/main/.github/images/screenshot_3.png"&gt;&lt;/a&gt;
  &lt;a rel="noopener noreferrer" href="https://raw.githubusercontent.com/tomfong/simple-qr/main/.github/images/screenshot_4.png"&gt;&lt;img height="300" src="https://res.cloudinary.com/practicaldev/image/fetch/s--yJ7pHiqb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/tomfong/simple-qr/main/.github/images/screenshot_4.png"&gt;&lt;/a&gt;
  &lt;a rel="noopener noreferrer" href="https://raw.githubusercontent.com/tomfong/simple-qr/main/.github/images/screenshot_5.png"&gt;&lt;img height="300" src="https://res.cloudinary.com/practicaldev/image/fetch/s--FmJrAwI---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/tomfong/simple-qr/main/.github/images/screenshot_5.png"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
About&lt;/h2&gt;
&lt;p&gt;Simple QR is a FOSS app to scan, create and store QR codes with a simple UI and experience. No backend service connected. No data collected. No ads.&lt;/p&gt;
&lt;p&gt;It's now available on the following platforms.&lt;/p&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;App Store&lt;/th&gt;
&lt;th&gt;Google Play&lt;/th&gt;
&lt;th&gt;GitHub&lt;/th&gt;
&lt;th&gt;IzzyOnDroid&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://apps.apple.com/us/app/simple-qr-by-tom-fong/id1621121553" rel="nofollow"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kxzvpK8N--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/tomfong/simple-qr/main/.github/images/appstore-badge.png" height="50"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.tomfong.simpleqr" rel="nofollow"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HTJOWmFJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/tomfong/simple-qr/main/.github/images/google-play-badge.png" height="50"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/tomfong/simple-qr/releases/latest"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZfeJ-4cQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/tomfong/simple-qr/main/.github/images/github-badge.png" height="50"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://apt.izzysoft.de/fdroid/index/apk/com.tomfong.simpleqr" rel="nofollow"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vER3QxQF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/tomfong/simple-qr/main/.github/images/IzzyOnDroid-badge.png" height="50"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h2&gt;
Features&lt;/h2&gt;
&lt;p&gt;By using the app, you can&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Scan QR Code and other barcodes in a second, including UPC, EAN, Code 39/128, ITF, Codabar, Aztec, Data Matrix, PDF417, MaxiCode and GS1 DataBar.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Import image files and scan the QR Code on it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create QR code from templates, which includes Free Text, URL, vCard Contact, Phone Number, Message, Email and Wi-Fi.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Automatically log results that you scan, create or view again. These logged records can be bookmarked for quick access, and also backupable.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Do tasks on the result content with a tap, including but not…&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/tomfong/simple-qr"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2&gt;
  
  
  What can I do with Simple QR?
&lt;/h2&gt;

&lt;p&gt;By using the app, you can&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Scan and read various barcodes by using camera.&lt;/li&gt;
&lt;li&gt;Import image to read QR code.&lt;/li&gt;
&lt;li&gt;Generate QR code from different templates.&lt;/li&gt;
&lt;li&gt;Customize the QR code, e.g. color, margin, error correction level.&lt;/li&gt;
&lt;li&gt;Do various tasks on the result content with a tap.&lt;/li&gt;
&lt;li&gt;Log the result content from scanning, creating or viewing again.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What makes Simple QR?
&lt;/h2&gt;

&lt;p&gt;To make it hybrid, I use &lt;strong&gt;ionic, capacitor&lt;/strong&gt; and &lt;strong&gt;angular&lt;/strong&gt; to develop Simple QR. If you are a beginner of ionic or angular, I think this project is a good reference to you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where can I download from?
&lt;/h2&gt;

&lt;p&gt;Simple QR is available on both &lt;a href="https://apps.apple.com/us/app/simple-qr-by-tom-fong/id1621121553"&gt;App Store&lt;/a&gt; and &lt;a href="https://play.google.com/store/apps/details?id=com.tomfong.simpleqr"&gt;Google Play&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you don't want to access to both stores, you can also download it from &lt;a href="https://github.com/tomfong/simple-qr/releases/latest"&gt;GitHub&lt;/a&gt; or &lt;a href="https://apt.izzysoft.de/fdroid/index/apk/com.tomfong.simpleqr"&gt;IzzyOnDroid&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Any kind of discussion, feedback or idea sharing is welcomed!&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>opensource</category>
      <category>ionic</category>
      <category>angular</category>
    </item>
  </channel>
</rss>
